1

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

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

这是在 Photoshop 上实现的预期结果: 用 Photoshop 调整大小

这就是我使用在画布上绘画的传统方法的时候 在画布上绘制

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

4

0 回答 0