Android画图并保存图片的具体实现代码
程序员文章站
2023-01-02 08:55:19
canvas是一个画布,你可以建立一个空白的画布,就直接new一个canvas对象,不需要参数。也可以先使用bitmapfactory创建一个bitmap对象,作为新的ca...
canvas是一个画布,你可以建立一个空白的画布,就直接new一个canvas对象,不需要参数。
也可以先使用bitmapfactory创建一个bitmap对象,作为新的canvas对象的参数,也就是说这个画布不是空白的,
如果你想保存图片的话,最好是bitmap是一个新的,而不是从某个文件中读入进来的,或者是drawable对象。
然后使用canvas画第一张图上去,在画第二张图上去,最后使用canvas.save(int flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,
如果是保存全部图层的 话使用 save( canvas.all_save_flag )。
最后所有的信息都会保存在第一个创建的bitmap中。代码如下:
java代码
/**
* create the bitmap from a byte array
*
* @param src the bitmap object you want proecss
* @param watermark the water mark above the src
* @return return a bitmap object ,if paramter's length is 0,return null
*/
private bitmap createbitmap( bitmap src, bitmap watermark )
{
string tag = "createbitmap";
log.d( tag, "create a new bitmap" );
if( src == null )
{
return null;
}
int w = src.getwidth();
int h = src.getheight();
int ww = watermark.getwidth();
int wh = watermark.getheight();
//create the new blank bitmap
bitmap newb = bitmap.createbitmap( w, h, config.argb_8888 );//创建一个新的和src长度宽度一样的位图
canvas cv = new canvas( newb );
//draw src into
cv.drawbitmap( src, 0, 0, null );//在 0,0坐标开始画入src
//draw watermark into
cv.drawbitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印
//save all clip
cv.save( canvas.all_save_flag );//保存
//store
cv.restore();//存储
return newb;
}
对图片进行缩小的方法:
java代码
/**
* lessen the bitmap
*
* @param src bitmap
* @param destwidth the dest bitmap width
* @param destheigth
* @return new bitmap if successful ,oherwise null
*/
private bitmap lessenbitmap( bitmap src, int destwidth, int destheigth )
{
string tag = "lessenbitmap";
if( src == null )
{
return null;
}
int w = src.getwidth();//源文件的大小
int h = src.getheight();
// calculate the scale - in this case = 0.4f
float scalewidth = ( ( float ) destwidth ) / w;//宽度缩小比例
float scaleheight = ( ( float ) destheigth ) / h;//高度缩小比例
log.d( tag, "bitmap width is :" + w );
log.d( tag, "bitmap height is :" + h );
log.d( tag, "new width is :" + destwidth );
log.d( tag, "new height is :" + destheigth );
log.d( tag, "scale width is :" + scalewidth );
log.d( tag, "scale height is :" + scaleheight );
matrix m = new matrix();//矩阵
m.postscale( scalewidth, scaleheight );//设置矩阵比例
bitmap resizedbitmap = bitmap.createbitmap( src, 0, 0, w, h, m, true );//直接按照矩阵的比例把源文件画入进行
return resizedbitmap;
}
也可以先使用bitmapfactory创建一个bitmap对象,作为新的canvas对象的参数,也就是说这个画布不是空白的,
如果你想保存图片的话,最好是bitmap是一个新的,而不是从某个文件中读入进来的,或者是drawable对象。
然后使用canvas画第一张图上去,在画第二张图上去,最后使用canvas.save(int flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,
如果是保存全部图层的 话使用 save( canvas.all_save_flag )。
最后所有的信息都会保存在第一个创建的bitmap中。代码如下:
java代码
复制代码 代码如下:
/**
* create the bitmap from a byte array
*
* @param src the bitmap object you want proecss
* @param watermark the water mark above the src
* @return return a bitmap object ,if paramter's length is 0,return null
*/
private bitmap createbitmap( bitmap src, bitmap watermark )
{
string tag = "createbitmap";
log.d( tag, "create a new bitmap" );
if( src == null )
{
return null;
}
int w = src.getwidth();
int h = src.getheight();
int ww = watermark.getwidth();
int wh = watermark.getheight();
//create the new blank bitmap
bitmap newb = bitmap.createbitmap( w, h, config.argb_8888 );//创建一个新的和src长度宽度一样的位图
canvas cv = new canvas( newb );
//draw src into
cv.drawbitmap( src, 0, 0, null );//在 0,0坐标开始画入src
//draw watermark into
cv.drawbitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印
//save all clip
cv.save( canvas.all_save_flag );//保存
//store
cv.restore();//存储
return newb;
}
对图片进行缩小的方法:
java代码
复制代码 代码如下:
/**
* lessen the bitmap
*
* @param src bitmap
* @param destwidth the dest bitmap width
* @param destheigth
* @return new bitmap if successful ,oherwise null
*/
private bitmap lessenbitmap( bitmap src, int destwidth, int destheigth )
{
string tag = "lessenbitmap";
if( src == null )
{
return null;
}
int w = src.getwidth();//源文件的大小
int h = src.getheight();
// calculate the scale - in this case = 0.4f
float scalewidth = ( ( float ) destwidth ) / w;//宽度缩小比例
float scaleheight = ( ( float ) destheigth ) / h;//高度缩小比例
log.d( tag, "bitmap width is :" + w );
log.d( tag, "bitmap height is :" + h );
log.d( tag, "new width is :" + destwidth );
log.d( tag, "new height is :" + destheigth );
log.d( tag, "scale width is :" + scalewidth );
log.d( tag, "scale height is :" + scaleheight );
matrix m = new matrix();//矩阵
m.postscale( scalewidth, scaleheight );//设置矩阵比例
bitmap resizedbitmap = bitmap.createbitmap( src, 0, 0, w, h, m, true );//直接按照矩阵的比例把源文件画入进行
return resizedbitmap;
}