我为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);
以下是图片:
这就是我对手表的看法:
我在调整大小时做错了什么?
答案 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;
}