在imageview上绘制形状并将最终图像保存到android中的sdcard

时间:2017-01-14 08:58:52

标签: android android-canvas android-bitmap

我正在制作一个绘制图像的工具。我正在使用自定义imageview绘制它并将新图像保存到手机存储中。 问题在于保存的图像分辨率。对于低分辨率图像,最终图像分辨率就是这样。但对于高分辨率图像,我在绘图后从ImageView获取的最终图像,当保存到存储时质量较差,因此图像质量变差。

建议我在绘制之后如何保存高分辨率图像。

这是代码行。

 Bitmap signOffBmp = Bitmap.createBitmap(mDrawingView.getDrawingCache());

其中

  

mDrawingView

是具有绘图功能和

的自定义imageview
  

signOffBmp

是低分辨率的最终图像位图。

此外,我发现链接似乎解决了我的问题,但事实并非如此 Improve image quality while using getDrawingCache - android 谢谢

2 个答案:

答案 0 :(得分:0)

您应该创建位图from a resource,而不是从缩放到屏幕分辨率后的视图绘图缓存中创建。

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable);

分辨率是每个显示尺寸的像素数。例如,如果您绘制500 * 500像素的图像以适合2" * 2"方块,则分辨率为250ppi(每英寸像素数)。 如果您在10" * 10"上绘制1000 * 1000像素的图像。方块,则分辨率为100ppi。


当Android在屏幕上绘制位图时,它仅缓存实际屏幕像素的数量,屏幕分辨率通常在170ppi和340ppi之间变化。

答案 1 :(得分:0)

这是您问题的根源:

Bitmap signOffBmp = Bitmap.createBitmap(mDrawingView.getDrawingCache());

您正尝试将自定义ImageView中的内容绘制到最终位图上。执行此操作时,您可以提高分辨率。您将获得与Custom ImageView相同的分辨率。

如果要在保存最终图像时控制分辨率,则需要执行以下操作:

  1. 您需要保留图片的原始Bitmap
  2. 在适当采样后将此原始Bitmap加载到ImageView上
  3. 在此ImageView上执行所有自定义绘图。您需要跟踪所有绘图操作,以便调用单个方法将绘制您提供的Canvas上的所有内容。
  4. 保存图片时,请使用您需要的分辨率创建新的Bitmap
  5. 创建新的Canvas并将Bitmap附加到其中。
  6. 将图像的位图绘制到此画布上。
  7. 现在,在此Canvas而不是ImageView上执行自定义绘图。您可能需要更改画布的矩阵,以便所有内容都符合规模。
  8. 最后,将此Bitmap保存到存储空间。
  9. 我不确定您应用的当前架构是如何的,因此您需要调整代码才能实现此目的。