【发布时间】:2024-03-08 16:09:02
【问题描述】:
我有一组小图像。如果我在画布上单独绘制这些图像,与我在屏幕大小的大位图上绘制它们并在画布上绘制该位图的情况相比,绘制质量显着降低。特别是线条会失真。见下图(右侧)。
从下面的代码来看,画布也支持缩放(scaling)。此问题发生在小规模因素上。
问题是如何将多张小图的绘制量提高到大图的标准。
这是在画布上绘制的多个位图的代码
canvas.scale(game.mScaleFactor, game.mScaleFactor);
canvas.translate(game.mPosX, game.mPosY);
for (int i = 0; i < game.clusters.size(); i++) {
Cluster cluster = game.clusters.get(i);
canvas.drawBitmap(cluster.Picture, cluster.left,
cluster.top, canvasPaint);
}
这是单个位图的代码,game.board 是一个屏幕大小的图像,上面绘制了所有的小位图。
canvas.scale(game.mScaleFactor, game.mScaleFactor);
canvas.translate(game.mPosX, game.mPosY);
canvas.drawBitmap(game.board, matrix, canvasPaint)
画笔设置了以下属性。`所有位图都是Bitmap.Config.ARGB_8888。
canvasPaint.setAntiAlias(true);
canvasPaint.setFilterBitmap(true);
canvasPaint.setDither(true);`
【问题讨论】:
-
将高分辨率图像渲染到固定尺寸的画布上意味着与使用较小尺寸的源图像相比,每个目标像素具有更多的源像素,结果是较大图像的下采样质量更好。要为较小的图像获得相同的结果,请从相同的高分辨率源以它们需要渲染的分辨率创建它们(即比例应为 1)
-
感谢您的评论。大位图是画布大小的 2 倍(绘制到最大缩放级别)。小图像是大位图的片段,尺寸较小,但比例为 2。因此比例因子范围为 0.5 到 1(表示缩放级别为 2)。当比例大小为 0.5(即正常画布大小但图像的一半)时会出现此问题。形成右侧图像线在 0.5 级受到显着影响。你认为我必须根据缩放级别创建多个图像吗?还是所有小图像都应该是大图像的大小?鉴于在某些情况下我有 400 个小图像,这两种方法都有问题。
-
我仔细查看了图像,较低的质量与双线性下采样产生的质量损失相匹配。您对
canvasPaint.setFilterBitmap(true);进行了双线性过滤,因此您无法通过任何编程方式来提高质量。由于锯齿的损失仅在高对比度线条上很明显,因此最好的选择是将拼图轮廓渲染为动态位图上的路径,从原始图像中删除线条这将为您提供一致的线条质量。跨度> -
好主意。我试过但不能使用,因为性能影响很大。仅绘制 400 张图像需要 30 毫秒(帧时间),但图像 + 轮廓需要 150 毫秒。
-
图像必须一次全部缩放。但是,如果您分别缩放每个部分,然后将它们再次组合在一起,它们之间的边界将看起来不太好。部分的分离应该在整体缩放之后进行。
标签: android canvas bitmap zooming