无论Android中的设备分辨率如何保持已保存图像的画布位置?

时间:2016-09-22 01:11:35

标签: android canvas bitmap

我在用户编辑图像后将三个图像视图保存到一个位图。问题是,一旦保存了最终结果,结果保存的图像在不同的屏幕分辨率上看起来并不总是一样。

在我的手机上,这是华硕Padfone X,保存的图像完美呈现。在我的合作伙伴电话(注6)中,已保存图像在结果位图上的定位已关闭。 (见下面的例子)

我使用以下代码将图像视图保存到单个图像:

Bitmap mainBmp = backImage.getDrawingCache();
Bitmap centerBmp = centerImage.getDrawingCache();
Bitmap handleBmp = handleImage.getDrawingCache();

Canvas canvas = new Canvas(mainBmp);
canvas.drawBitmap(centerBmp, 17, 95, null);
canvas.drawBitmap(handleBmp, 17, 85, null);

哪个可以在我的手机上正常保存,但不能保存更大的屏幕/更高的分辨率。无论保存的设备如何,如何确保生成的保存图像看起来都一样?

差异的例子

enter image description here

2 个答案:

答案 0 :(得分:1)

你需要扩展。例如,假设设备1为500x1000像素,设备2为600x1200。让我们说位图是300x400,从x的30像素和y的100的偏移开始。

位图需要按两种屏幕尺寸的比例增大。因此它需要300 *(600/500)像素宽和400 *(1200/1000)像素大。偏移量也需要扩展到30 *(600/500)和100 *(1200/1000)。

请注意,缩放时可能会出现拉伸,像素化和其他图像缺陷。你伸展的越多,它就越糟糕。萎缩也可能带来缺陷,但这些缺陷往往更为轻微。

这是一个简单的例子 - 我给出的两个屏幕具有相同的宽高比(宽度比:高度)。在不同宽高比的情况下,您需要选择:

1)保持图像的纵横比相同。这意味着你将在1个方向上留出空白,但图像不会受到影响。

2)允许图像的宽高比改变。这将不留空格,但会使图像偏斜。

对于#2,请使用与上面相同的代码。对于#1,找出哪个维度需要缩放最小,并使用它来缩放x和y。

在通用图像上没有任何缺陷的情况下,无法从任何尺寸的手机扩展到任何尺寸的手机。您必须在上述两个选项之间进行选择。

答案 1 :(得分:0)

我还发现,如果我改为使用imageview.getWidth()和imageview.getHeight(),我可以定位每个"层"无论屏幕尺寸如何,我都需要它。我在一台小型Android设备上测试了这种方法,一直到平板电脑,所保存的图像在所有设备上都很完美。

我所做的是使用Photoshop确定每个图像的像素大小("图层")。然后我使用在线px到dp计算器/转换器来确定每层的正确dp大小。我为布局中的每个图层设置了特定的dp宽度和高度。对于我需要保存到主图像的每个图层,我通过获取mainimageviews的高度和宽度并从边缘到该图层的相应边缘减去所需的像素来计算x和y尺寸。通过反复试验,我运行了几次应用程序,以获得我想要的每一层的确切位置。保存图像的结果与用户看起来完全一致。希望这有助于将来的其他人。