私はカメラで写真を撮り、それを回転させて拡大縮小するアプリをやっています。カメラが間違った回転画像を返すため、画像を回転する必要があり、サイズを縮小するために拡大縮小する必要があります。最初に、カメラから返された元の画像を一時ディレクトリに保存し、それを読み取って変更を加え、新しい画像を新しいファイルに保存します。マトリックスを使用して画像を回転およびスケーリングしようとしましたが、品質が低下します。次に、最初に Bitmap.createScaledBitmap でスケーリングしてから、マトリックスで回転させようとしましたが、結果はマトリックスのみを使用したものよりもさらに醜くなります。次に、最初に回転させてから、常に Bitmap.createScaledBitmap を使用してサイズを変更しようとしました。画質は落ちていませんが、回転後に拡大縮小すると伸びてしまい、幅と高さが反転しています。回転に応じて高さと幅を反転させようとしましたが、再び品質が低下します。これは私が書いた最後のコードです:
in= new FileInputStream(tempDir+"/"+photo1_path);
out = new FileOutputStream(file+"/picture.png");
Bitmap src = BitmapFactory.decodeStream(in);
int iwidth = src.getWidth();
int iheight = src.getHeight();
int newWidth = 0;
int newHeight = 0;
newWidth = 800;
newHeight = 600;
// calculate the scale - in this case = 0.4f
float scaleWidth = ((float) newWidth) / iwidth;
float scaleHeight = ((float) newHeight) / iheight;
// createa matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
//matrix.postScale(scaleWidth, scaleHeight);
int orientation = getOrientation(MyActivity.this,Uri.parse(tempDir+"/"+photo1_path));
switch(orientation) {
case 3:
orientation = 180;
break;
case 6:
orientation = 90;
break;
case 8:
orientation = 270;
break;
}
int rotate = 0;
switch(orientation) {
case 90:
rotate=90;
break;
case 180:
rotate=180;
break;
case 270:
rotate=270;
break;
}
// rotate the Bitmap
matrix.postRotate(rotate);
src =Bitmap.createScaledBitmap(src , newWidth, newHeight, false);
// recreate the new Bitmap
Bitmap new_bit = Bitmap.createBitmap(src, 0, 0,
src.getWidth(), src.getHeight(), matrix, true);
new_bit.compress(Bitmap.CompressFormat.PNG, 100, out);
何かアドバイス?
編集:画像を回転または拡大縮小するだけであれば、品質は低下しません。両方を行うと、画質が低下します。また、サイズを変更してスケーリングした後に画像を ImageView に配置しても、品質は失われません。品質が低下するのは、ファイルに保存するときだけです。