我试图在Android中实现高质量的图像调整大小。我正在尝试这里列出的所有方法,而且我可以在Google上找到,但我仍然找不到一个好的解决方案。
为了举例说明我想要实现的目标以及我遇到的问题,我发布了3张不同结果的图片。基本上我只是从SD卡中获取大图,调整大小并裁剪它。
这是在Photoshop上实现的理想结果:
这就是我在画布上使用绘画的传统方法
这个结果是我使用ImageMagick的时候。它更好,但在某些设备上调整大小需要几分钟(对于移动应用程序来说不酷)
所以,这是我使用canvas方法的代码:
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