Androidで高品質の画像サイズ変更を実現しようとしています。ここにリストされている方法と、Google で見つけることができるすべての方法を試していますが、まだ良い解決策が見つかりません。
私が達成しようとしていることと私が抱えている問題を例示するために、異なる結果の 3 つの画像を投稿しています。基本的に、SDカードから大きな画像を取得し、サイズを変更してトリミングしています。
Photoshop で実現した望ましい結果を次に示します。
そして、これは私がキャンバスに描く伝統的な方法を使用するときです
そして、この結果は ImageMagick を使用した場合です。より良いですが、一部のデバイスではサイズ変更に数分かかります (モバイルアプリにはクールではありません)。
したがって、キャンバスメソッドを使用したコードは次のとおりです。
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(params[0].path_source, o);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = false;
options.inPurgeable = true;
options.inScaled = false;
options.inPreferQualityOverSpeed = true;
options.inSampleSize = Utils.calculateInSampleSize(o, 640, 640);
Bitmap image = BitmapFactory.decodeFile(params[0].path_source, options);
... calculate right x, y for cropping ..
Matrix m = new Matrix();
m.postScale(new_width/(float)width, new_width/(float)width);
m.postRotate(rotation);
Bitmap result = Bitmap.createBitmap(640, 640, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.setMatrix(m);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawBitmap(image, -x, -y, paint);
FileOutputStream fos = activity.openFileOutput(Utils.NOME_ARQUIVO_FOTO, Context.MODE_PRIVATE);
result.compress(CompressFormat.JPEG, 100, fos);
fos.close();
ImageMagick を使用したコードは次のとおりです。
ImageInfo info = new ImageInfo(params[0].path_source);
MagickImage image = new MagickImage(info);
//I can optionally use sampleImage for better performance, but worse quality (still better then android canvas)
//image = image.sampleImage(new_sampled_width, new_sampled_height);
image = image.scaleImage(new_width, new_height);
image = image.cropImage(new Rectangle(x, y, 640, 640));
image = image.rotateImage(rotation);
byte blob[] = image.imageToBlob(info);
FileOutputStream fos = activity.openFileOutput(Utils.NOME_ARQUIVO_FOTO, Context.MODE_PRIVATE);
fos.write(blob);
fos.close();
編集:テストのためにXperia PlayでAndroid 2.3.4を使用しています
編集 2: CompressFormat.PNG で保存すると、ほぼ完璧な結果が得られます! ヒントをくれたFunkTheMonkに感謝します!唯一の問題は、コードの後半でこの画像を別の画像とブレンドするために ImageMagick を使用し、PNG をサポートする ImageMagick を構築できなかったことです。