位图缩放会破坏质量

时间:2016-08-30 08:46:44

标签: android image wear-os image-resizing android-bitmap

我为Android Wear制作了Watch Face 但问题是图像缩放。当我调整大小时,背景,标记和小工具的图像质量会降低。

例如,我将480x480背景图像放在drawable-nodpi文件夹中(我也试过了其他dpi),我将它重新缩放为:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = true;
Bitmap bgImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.ticks_1, options);
bgImage = Bitmap.createScaledBitmap(bgImage , width, height, false);

以下是图片:

background enter image description here

这就是我对手表的看法:

screenshot

我在调整大小时做错了什么?

4 个答案:

答案 0 :(得分:7)

我找到了一个解决方案here,效果很好 以下是缩放图像的代码部分:

->where('fieldName', 'not like', '%string%')

答案 1 :(得分:2)

以下代码的一些评论。解码的选项部分没有做任何事情,因为没有设置样本大小。所以它可以删除。

// BitmapFactory.Options options = new BitmapFactory.Options();
// options.inScaled = true;
// Bitmap bgImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.ticks_1, options);
Bitmap bgImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.ticks_1);
bgImage = Bitmap.createScaledBitmap(bgImage , width, height, false);

我认为图像失真的问题实际上就是图像本身。调整大小时降至75%。它只是无法调整大小,同时保持图像看起来完全一样。这些条带非常薄,以至于任何轻微的脱落都会导致看起来不同。

我建议用更厚的戒指来试试。并查看图像是否扭曲。即使只是作为快速测试或永久解决方案。

<强>更新

要在所有分辨率下保持图像清晰,请查看矢量图像。这些像素在所有分辨率下都是完美的,并且会在所有手表上呈现出精美的图形特别是,由于您使用的是基本形状,因此应该很容易实现。

如果要调整位图大小,则可能会在重绘图像时出现模糊。 如果它必须是位图,请在不同的dpi文件夹中包含多个分辨率,以便android相应地选择,这是调整大小的最佳匹配。

答案 2 :(得分:1)

更改

bgImage = Bitmap.createScaledBitmap(bgImage , width, height, false);

bgImage = Bitmap.createScaledBitmap(bgImage , width, height, true);

这将应用简单的双线性插值。由于圆圈太薄,结果将会有点模糊,但会有更多信息用于创建缩放图像。结果图像也会有一些莫尔图案,但与示例图片相比会失真。如果你使用双立方滤波在Photoshop中缩小图像,你将获得最佳效果,但即使这样,使用矢量图形也会胜过Doomsknight建议的任何基于位图的工作。

答案 3 :(得分:-1)

“接受以上”会剪切位图并尝试我的答案

  public Bitmap getResizedBitmap(Bitmap bitmap, int newWidth, int newHeight) {
             Bitmap scaledBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());

    float scaleX = newWidth / (float) bitmap.getWidth();
    float scaleY = newHeight / (float) bitmap.getHeight();
    float pivotX = 0;
    float pivotY = 0;

    Matrix scaleMatrix = new Matrix();
    scaleMatrix.setScale(scaleX, scaleY, pivotX, pivotY);

    Canvas canvas = new Canvas(resizedBitmap);
    canvas.setMatrix(scaleMatrix);
    canvas.drawBitmap(bitmap, 0, 0, new Paint(Paint.FILTER_BITMAP_FLAG));

    return resizedBitmap;
}