在Android中将canvas转换为位图图像
我正试图在canvas上开发一个应用程序,我在canvas上绘制位图。绘制完成后,我正在尝试将其转换为位图图像。
谁能给我一个build议。
先谢谢你。
build议取决于你正在尝试做什么。
如果你担心你的控件需要很长时间才能绘制,而且你想绘制一个位图,所以你可以通过一个canvas来刷新位图,而不是重新绘制,那么你不希望对平台进行双重猜测- 控件自动将其绘图caching到临时位图,甚至可以使用getDrawingCache()
从控件中提取这些getDrawingCache()
如果要使用canvas绘制位图,通常的方法是:
- 使用
Bitmap.createBitmap()
创build正确大小的位图 - 使用
Canvas(Bitmap)
构造函数创build一个指向该位图的canvas实例 - 绘制到canvas上
- 使用位图
所以你创build一个新的Bitmap
,例如:
Bitmap myBitmap = new Bitmap( (int)Width, (int)Height, Config.RGB_565 )
width
和height
与您的canvas相同。
接下来,使用canvas.setBitmap(myBitmap)
,而不是drawBitmap()
。
在你调用setBitmap
,你在canvas上绘制的所有东西都是绘制在你的myBitmap
并且通过我已经说明的示例代码。
编辑 :
您不能直接创build一个位图,如:
Bitmap myBitmap = new Bitmap( (int)Width, (int)Height, Config.RGB_565 );
你必须改用:
Bitmap myBitmap = Bitmap.createBitmap( (int)Width, (int)Height, Config.RGB_565 );
其他例子:
public Bitmap getBitmapNews(int item , boolean selected, int numbernews){ Bitmap bitmap; if(selected) bitmap=mBitmapDown[item].copy(Config.ARGB_8888, true); else bitmap=mBitmapUp[item].copy(Config.ARGB_8888, true); Canvas canvas = new Canvas(bitmap); if(numbernews<10){ canvas.drawBitmap(mNotiNews[numbernews],0,0,null); }else{ canvas.drawBitmap(mNotiNews[0],0,0,null); } return bitmap; }
以下是将canvas转换为位图并将其存储到图库或特定文件夹的步骤。
注意:确保您已经获得了WRITE_EXTERNAL_STORAGE的许可
activity_main.xml中
<LinearLayout android:id="@+id/linearLayout" android:orientation="horizontal" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> <DrawingView android:id="@+id/drawingView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
MainActivity.java
-
创build父布局的引用
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
-
将其存储到画廊
final String imagename = UUID.randomUUID().toString() + ".png"; MediaStore.Images.Media.insertImage(getContentResolver(), linearLayout .getDrawingCache(), imagename, "drawing");
-
转换成位图
linearLayout.setDrawingCacheEnabled(true); linearLayout.buildDrawingCache(); Bitmap bitmap = Bitmap.createBitmap(linearLayout.getDrawingCache());