2011-12-28 7 views
3

私はこれについて頭を悩ましています。私がしようとしているのは:写真を撮り、それを元の寸法を保ったままPNGに圧縮し、それをsdCardに保存することです。私がこれをやる必要がある理由は、再圧縮する必要があるため、Base64でエンコードしてサーバーに送ることができるからです。問題は1.ファイルが大きすぎる2.私はメモリが不足していると私はこれを正しく行っているかわからない3.。あなたの助けのためのAndroid - 結果のアクティビティでSDCARDに保存する前にビットマップを圧縮します。

おかげでここ

が私のコードです:

@Override 
public void onClick(View button) { 
    switch (button.getId()) { 
     case R.id.cameraButton: 
      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(new File("/sdcard/test.png"))); 
      startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
      break; 
     case R.id.galleryButton: 
      sendToDatabase(); 
      break; 
    } 
} 

// Camera on activity for result - save it as a bmp and place in imageview 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_PIC_REQUEST) { 
     // do something 
    } 

    if (resultCode == Activity.RESULT_OK) { 
     Log.d(TAG, "result ok"); 

     picture = BitmapFactory.decodeFile("/sdcard/test.png"); 

     // Create string to place it in sd card 
     String extStorageDirectory = Environment 
       .getExternalStorageDirectory().toString(); 
     //create output stream 
     OutputStream outputStream = null; 
     //create file 
     File file = new File(extStorageDirectory, "test.png"); 
     try { 
      outputStream = new FileOutputStream(file); 
      picture.compress(Bitmap.CompressFormat.PNG, 80, outputStream); 
      //picture.recycle(); 
      outputStream.flush(); 
      outputStream.close(); 
     } catch (IOException e){ 
      Log.d(TAG, "ERROR"); 
     } 
     imageView.setImageBitmap(picture); 
    } 
} 

public void sendToDatabase() { 
    InputStream inputStream = null; 

    //get the picture from location 
    picture = BitmapFactory.decodeFile("/sdcard/test.png"); 

    // CONVERT: 
    ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
    Boolean didItWork = picture.compress(Bitmap.CompressFormat.PNG, 50, outStream); 
    picture.recycle(); 
    if (didItWork = true) { 
     Log.d(TAG, "compression worked"); 
    } 
    Log.d(TAG, "AFTER. Height: " + picture.getHeight() + " Width: " 
     + picture.getWidth()); 
    final byte[] ba = outStream.toByteArray(); 
    try { 
     outStream.close(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
} 
+1

Bitmap.compress(..)の品質設定は、PNG圧縮には影響しないことに注意してください。ファイルサイズを小さくする場合は、損失の多いJPGまたはイメージサイズのいずれかを選択してください。 – harism

答えて

13

あなたはpicture.compress(Bitmap.CompressFormat.PNG、50、OUTSTREAM)を行うと、圧縮は無損失であるPNGとして動作しませんが、品質設定は無視されます。この場合、パラメータ50は動作しません。 CompressFormat.PNGをCompressFormat.JPEGに変更することをお勧めします。

+0

ありがとうございます。私はJPEGに圧縮を終了しました。 – Splitusa

+0

ありがとうございます+1 –

関連する問題