Android Bitmap 与 Drawable之间的区别和转换

Android Bitmap 与 Drawable之间的区别和转换,第1张

一、相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象

2、Canvas画布,绘图的目的区域,用于绘图

3、Bitmap位图,用于图的处理

4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

Java代码

Resources res = getResources();

Bitmap bmp = BitmapFactorydecodeResource(res, Rdrawableicon);

2、Bitmap → byte[]

Java代码

public byte[] Bitmap2Bytes(Bitmap bm) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bmcompress(BitmapCompressFormatPNG, 100, baos);

return baostoByteArray();

}

3、byte[] → Bitmap

Java代码

public Bitmap Bytes2Bimap(byte[] b) {

if (blength != 0) {

return BitmapFactorydecodeByteArray(b, 0, blength);

} else {

return null;

}

}

4、Bitmap缩放

Java代码

public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {

int w = bitmapgetWidth();

int h = bitmapgetHeight();

Matrix matrix = new Matrix();

float scaleWidth = ((float) width / w);

float scaleHeight = ((float) height / h);

matrixpostScale(scaleWidth, scaleHeight);

Bitmap newbmp = BitmapcreateBitmap(bitmap, 0, 0, w, h, matrix, true);

return newbmp;

}

5、将Drawable转化为Bitmap

Java代码

public static Bitmap drawableToBitmap(Drawable drawable) {

// 取 drawable 的长宽

int w = drawablegetIntrinsicWidth();

int h = drawablegetIntrinsicHeight();

// 取 drawable 的颜色格式

BitmapConfig config = drawablegetOpacity() != PixelFormatOPAQUE BitmapConfigARGB_8888

: BitmapConfigRGB_565;

// 建立对应 bitmap

Bitmap bitmap = BitmapcreateBitmap(w, h, config);

// 建立对应 bitmap 的画布

Canvas canvas = new Canvas(bitmap);

drawablesetBounds(0, 0, w, h);

// 把 drawable 内容画到画布中

drawabledraw(canvas);

return bitmap;

}

6、获得圆角

Java代码

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {

int w = bitmapgetWidth();

int h = bitmapgetHeight();

Bitmap output = BitmapcreateBitmap(w, h, ConfigARGB_8888);

Canvas canvas = new Canvas(output);

final int color = 0xff424242;

final Paint paint = new Paint();

final Rect rect = new Rect(0, 0, w, h);

final RectF rectF = new RectF(rect);

paintsetAntiAlias(true);

canvasdrawARGB(0, 0, 0, 0);

paintsetColor(color);

canvasdrawRoundRect(rectF, roundPx, roundPx, paint);

paintsetXfermode(new PorterDuffXfermode(ModeSRC_IN));

canvasdrawBitmap(bitmap, rect, rect, paint);

return output;

}

7、获得带倒影的

Java代码

public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {

final int reflectionGap = 4;

int w = bitmapgetWidth();

int h = bitmapgetHeight();

Matrix matrix = new Matrix();

matrixpreScale(1, -1);

Bitmap reflectionImage = BitmapcreateBitmap(bitmap, 0, h / 2, w,

h / 2, matrix, false);

Bitmap bitmapWithReflection = BitmapcreateBitmap(w, (h + h / 2),

ConfigARGB_8888);

Canvas canvas = new Canvas(bitmapWithReflection);

canvasdrawBitmap(bitmap, 0, 0, null);

Paint deafalutPaint = new Paint();

canvasdrawRect(0, h, w, h + reflectionGap, deafalutPaint);

canvasdrawBitmap(reflectionImage, 0, h + reflectionGap, null);

Paint paint = new Paint();

LinearGradient shader = new LinearGradient(0, bitmapgetHeight(), 0,

bitmapWithReflectiongetHeight() + reflectionGap, 0x70ffffff,

0x00ffffff, TileModeCLAMP);

paintsetShader(shader);

// Set the Transfer mode to be porter duff and destination in

paintsetXfermode(new PorterDuffXfermode(ModeDST_IN));

// Draw a rectangle using the paint with our linear gradient

canvasdrawRect(0, h, w, bitmapWithReflectiongetHeight()

+ reflectionGap, paint);

return bitmapWithReflection;

}

三、Drawable

1、Bitmap转换成Drawable

Java代码

Bitmap bm=xxx; //xxx根据你的情况获取

BitmapDrawable bd= new BitmapDrawable(getResource(), bm);

因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。

2、Drawable缩放

Java代码

public static Drawable zoomDrawable(Drawable drawable, int w, int h) {

int width = drawablegetIntrinsicWidth();

int height = drawablegetIntrinsicHeight();

// drawable转换成bitmap

Bitmap oldbmp = drawableToBitmap(drawable);

// 创建 *** 作用的Matrix对象

Matrix matrix = new Matrix();

// 计算缩放比例

float sx = ((float) w / width);

float sy = ((float) h / height);

// 设置缩放比例

matrixpostScale(sx, sy);

// 建立新的bitmap,其内容是对原bitmap的缩放后的图

Bitmap newbmp = BitmapcreateBitmap(oldbmp, 0, 0, width, height,

matrix, true);

return new BitmapDrawable(newbmp);

}

是本地的吗

如果是本地,可以通过BitmapFactorydecodeResource(res,id);

来获取到这个Bitmap,获取到这个Bitmap,你要的大小都出来了啊

如果是网络,也可以通过BitmapFactory的获取

首先得到Bitmap对象所占资源的大小,在新的API上提供了一个方法

bitmapgetByteCount()   // from API Level 12

也就是说从SDK12才能使用这个方法,针对以前的版本还是不能使用,那么怎么办?看第二种方法

bitmapgetRowBytes() bitmapgetHeight() //这样也能很准确的计算出Bitmap所占内存的大小,方法都是从SDK1就开始存在的。bingo!正解!

需要注意的是我上面说的两种方法是得到bitmap对象在内存中所占的存储空间大小,其实比实际(比如文件)大,如果想得到文件大小呢?

如何得到bitmap所使用的文件大小?

bitmapcompress(format, quality, stream)

至于方法的解释,参数的传入自己去看API文档,最后一个参数是一个OutPutStream对象,得到大小

#include <stdioh>

#include <malloch>

#include <stdlibh>

#include <iostream>

using namespace std;

/位图信息头BITMAPINFOHEADER,这个结构的长度是固定的,为40个字节其定义如下:/

typedef struct tagBITMAPINFOHEADER

{

unsigned long biSize; /指定这个结构的长度,为40/

long biWidth; /指定图象的宽度,单位是象素/

long biHeight; /指定图象的高度,单位是象素/

unsigned short biPlanes; /必须是1,不用考虑/

unsigned short biBitCount; /指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4(16色图),8(256色),24(真彩色图)/

unsigned long biCompression; /指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS/

unsigned long biSizeImage; /指定实际的位图数据占用的字节数/

long biXpolsPerMeter; /指定目标设备的水平分辨率,单位是每米的象素个数。/

long biYpelsPerMeter; /指定目标设备的垂直分辨率,单位同上。/

unsigned long biClrUsed; /指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。/

unsigned long biClrImportant; /指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。/

}BITMAPINFOHEADER;

void main()

{

BITMAPINFOHEADER bitmapinfoheader;

FILE stream;

memset(&bitmapinfoheader,0,sizeof(BITMAPINFOHEADER));

stream=fopen("E:\\3bmp","r");

fseek(stream,14,1);

fread((char)&bitmapinfoheader,sizeof(BITMAPINFOHEADER),1,stream);

fclose(stream);

cout<<bitmapinfoheaderbiHeight<<endl;

cout<<bitmapinfoheaderbiWidth<<endl;

}

调试运行正确 128128

以上就是关于Android Bitmap 与 Drawable之间的区别和转换全部的内容,包括:Android Bitmap 与 Drawable之间的区别和转换、android 编程 如何确定图片的大小、android开发怎么得到Bitmap所占资源的大小等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9309484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存