一、相关概念
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所占资源的大小等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)