更好的选择ImageMagick或Canvas用于在Android中调整图像大小

时间:2013-05-15 14:01:51

标签: android imagemagick

我试图在Android中实现高质量的图像调整大小。我正在尝试这里列出的所有方法,而且我可以在Google上找到,但我仍然找不到一个好的解决方案。

为了举例说明我想要实现的目标以及我遇到的问题,我发布了3张不同结果的图片。基本上我只是从SD卡中获取大图,调整大小并裁剪它。

这是在Photoshop上实现的理想结果: resize with photoshop

这就是我在画布上使用绘画的传统方法 draw on canvas

这个结果是我使用ImageMagick的时候。它更好,但在某些设备上调整大小需要几分钟(对于移动应用程序来说不酷) resize with 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

0 个答案:

没有答案