2011-11-28 3 views
4

Avec le code suivant montre un aperçu de l'appareil photo verticalement et cela fonctionne .. MAIS !! Je reçois une photo dans le paysage! :(Problèmes de prise de vue avec Android (Appareil photo vertical | Portrait)

Comment puis-je construire verticalement? J'ai la vue d'aperçu à la verticale, mais je ne peux pas enregistrer l'image verticalement.

salutations et remerciements, Fran

ONCLICK

public void onClick(View arg0) { 
     camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG); 
} 

PREVIEW

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    if (previewing) { 
     camera.stopPreview(); 
     previewing = false; 
    } 
    if (camera != null) { 
     /* 
     * camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); 
     * previewing = true; 
     */ 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(width, height); 
     camera.setParameters(parameters); 

     // Condicions per utilitzar la orientacio adecuada segons el sdk 
     if (Integer.parseInt(Build.VERSION.SDK) >= 8) 
      setDisplayOrientation(camera, 90); 
     else { 
      if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
       parameters.set("orientation", "portrait"); 
       parameters.set("rotation", 90); 
      } 
      if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       parameters.set("orientation", "landscape"); 
       parameters.set("rotation", 90); 
      } 
      camera.setParameters(parameters); 
     } 

     // camera.startPreview(); 
     previewing = true; 
    } 
} 

Photographier

PictureCallback myPictureCallback_JPG = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // intentar canvia horientacio 
     Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); 
     //bitmapPicture. 

     OutputStream imageFileOS; 
     try { 
      imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/iboo/captura.jpg")); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 
      // Missatge en cas de capturar l'imatge correctament 
      Toast.makeText(Principal.this, "Imatge Capturada!", 
        Toast.LENGTH_LONG).show(); 
      MostrarFoto("/sdcard/DCIM/iboo/captura.jpg"); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     // camera.startPreview(); 


       } 
}; 

Répondre

7

C'est la solution que j'ai implémentée. Cela fonctionne parfaitement. J'espère que ça aide.

PictureCallback myPictureCallback_JPG = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 6; 
     options.inDither = false; // Disable Dithering mode 
     options.inPurgeable = true; // Tell to gc that whether it needs free 
            // memory, the Bitmap can be cleared 
     options.inInputShareable = true; // Which kind of reference will be 
              // used to recover the Bitmap 
              // data after being clear, when 
              // it will be used in the future 
     options.inTempStorage = new byte[32 * 1024]; 
     options.inPreferredConfig = Bitmap.Config.RGB_565; 
     bMap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length, options); 

     // others devices 
     if(bMap.getHeight() < bMap.getWidth()){ 
      orientation = 90; 
     } else { 
      orientation = 0; 
     } 

     Bitmap bMapRotate; 
     if (orientation != 0) { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(orientation); 
      bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), 
        bMap.getHeight(), matrix, true); 
     } else 
      bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(), 
        bMap.getHeight(), true); 


     FileOutputStream out; 
     try { 
      out = new FileOutputStream(
        String.format("/sdcard/DCIM/test/screen.jpg")); 
      bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      if (bMapRotate != null) { 
       bMapRotate.recycle(); 
       bMapRotate = null; 
      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     camera.startPreview(); 
     MostrarFoto(imageInSD); 
     editor = prefs.edit(); 
     editor.putString("PathSeleccio", imageInSD); 
     editor.commit(); 
    } 
}; 
+0

je ne sais pas où vous obtenez la variable de bMap et la variable d'orientation ne semble pas être déclarée. – jimbob

2

Jetez un oeil here.

+0

Merci pour la réponse. Je suis nouveau à Java et je dois encore l'implémenter. Quelqu'un peut-il m'aider? – ephramd

+0

Ce code ne fonctionne qu'avec API NIVEAU 8 (version 2.2) et je travaille avec la version 2.1 (api niveau 7). Je ne sais pas ce que je peux faire .. ¿Une idée? – ephramd

+0

Quelles lignes ne compilent pas? –

0

Pour définir l'orientation de l'utilisation de l'image ci-dessous le code:

Matrix mat = new Matrix(); 
mat.postRotate(90); 
image_to_upload = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true); 
0

Vous n'avez pas réellement besoin de tourner bitmap. Il est la mémoire consommer/lent etc ... On dirait qu'il est mieux dans votre cas (enregistrement dans un fichier juste après coup) de mettre à jour Exif tags in a JPEG file, par exemple:

int degrees = 90; 
    ExifInterface exif = new ExifInterface(path); 
    exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degrees)); 
    exif.saveAttributes(); 
+0

ne fonctionnait pas pour moi. J'ai passé ce chemin mais l'image est toujours en mode paysage, /storage/sdcard0/Pictures/Hijab2Go/IMG_20140318_114648.jpg – Hesam

1
Camera.Parameters param; 
param = camera.getParameters(); 

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
if(display.getRotation() == Surface.ROTATION_0) 
{ 
    camera.setDisplayOrientation(90); 
    param.setRotation(90); 
} 
if(display.getRotation() == Surface.ROTATION_270) 
{ 
    camera.setDisplayOrientation(180); 
    param.setRotation(180); 
} 

camera.setParameters(param); 
camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
Questions connexes