2012-03-07 14 views
9

kaydetmeden önce. Ben resim çekildikten sonra ne yapıyoruz: İstiyorum NeAndroid Döndür Resim Sadece benim kamera aktivitesini bitmiş ve harika verileri kurtarıyor

protected void savePictureData() { 
    try { 
     FileOutputStream fs = new FileOutputStream(this.photo); 
     fs.write(this.lastCamData); 
     fs.close(); //okay, wonderful! file is just written to the sdcard 

     //--------------------- 
     //--------------------- 
     //TODO in here: dont save just the file but ROTATE the image and then save it! 
     //--------------------- 
     //--------------------- 


     Intent data = new Intent(); //just a simple intent returning some data... 
     data.putExtra("picture_name", this.fname); 
     data.putExtra("byte_data", this.lastCamData); 
     this.setResult(SAVED_TOOK_PICTURE, data); 
     this.finish(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     this.IOError(); 
    } 

} 

Yukarıdaki kodda verilen yorum olarak zaten. Görüntünün sadece dosyaya kaydedilmesini değil, döndürülmesini ve kaydedilmesini istemiyorum! Teşekkürler!

// DÜZENLEME: Ben kadar şu anda duyuyorum Ne

byte[] pictureBytes; 
Bitmap thePicture = BitmapFactory.decodeByteArray(this.lastCamData, 0, this.lastCamData.length); 
Matrix m = new Matrix(); 
m.postRotate(90); 
thePicture = Bitmap.createBitmap(thePicture, 0, 0, thePicture.getWidth(), thePicture.getHeight(), m, true); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
thePicture.compress(CompressFormat.JPEG, 100, bos); 
pictureBytes = bos.toByteArray(); 

FileOutputStream fs = new FileOutputStream(this.photo); 
fs.write(pictureBytes); 
fs.close(); 
Intent data = new Intent(); 
data.putExtra("picture_name", this.fname); 
data.putExtra("byte_data", pictureBytes); 
this.setResult(SAVED_TOOK_PICTURE, data); 
this.finish(); 
+0

olası yinelenen [Android: bir merkez noktası üzerinde bir bit eşlem döndürmek için nasıl] (http://stackoverflow.com/questions/4166917/android-how-to-rotate-a-bitmap-on-a -Center noktalı) – slayton

+0

nah, pek değil, onun döndürmek ve daha sonra – androidavid

+0

benim çözüm işe görünüyor iyi misin kaydetmek konusunda daha fazla - projeyi temizlenir ... – androidavid

cevap

4

(hala Works ancak büyük görüntülerle bellek sorunları çalışır) Eğer sizin FileOutputStream o orijinal yeni bir Bitmap oluşturabilir oluşturmadan önce Matrix kullanılarak dönüştürülmüştür. m orijinal bitmap devrik bir matrisi tanımlar

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

: Bu yöntemi kullanmak istiyorsunuz Bunu yapmak için. Android: How to rotate a bitmap on a center point

+0

hey benim düzenlemem bir göz atın; gidecekseniz yeterli bellek (normal şartlarda olması gereken) zaman – androidavid

+0

Ben böyle bir şey çalışıyorum. Ama ne bir istisna var bit eşlem kopyalayın: belleğe ... –

+0

@JoubertVasconcelos dışına, daha sonra resmi ölçeklendirme gerekir. – slayton

17

sadece sd karttan yolunu okuyabilir ve aşağıdaki kod ... bunu dönen sonra mevcut bir fotoğrafı değiştirin edeceğiz yapın: Bu soruya bu göz nasıl yapılacağına ilişkin bir örnek için

Not: Exif, çoğu aygıtta çalışmaz, yanlış veri verir, bu nedenle, istediğiniz herhangi bir dereceye kadar kaydetmeden önce sabit kodu kodlamak iyidir, Sadece postRotate içindeki açı değerini değiştirmek zorundasınızdır. istediğin her şey.

String photopath = tempphoto.getPath().toString(); 
    Bitmap bmp = BitmapFactory.decodeFile(photopath); 

    Matrix matrix = new Matrix(); 
    matrix.postRotate(90); 
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 

    FileOutputStream fOut; 
    try { 
     fOut = new FileOutputStream(tempphoto); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
     fOut.flush(); 
     fOut.close(); 

    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+0

Bu benim için çalıştı. Teşekkürler. – BRS

+0

Büyük patron, benim için de çalıştı! –

+0

Fotoğraflı programcılara sahip olduğumuz problem, bitmap sınıfından geliyor! Her zaman, bitmap sınıfı için görüntüyü geçirirsiniz, bu fotoğraf 90 derece döner. Ardından çözüm, her zaman bir bitmap sınıfı kullandığımız ve 'matrix.postRotate (90)') uygulamamız gereken de fotoğrafı göstermemiz gerektiğidir. döndürülmüş bir bitmap oluşturmak. –