Android中的bitmap,drawable,canvas以及paint
16lz
2021-01-23
public void saveMyBitmap(String bitName, Bitmap mBitmap) {File f = new File("/sdcard/" + bitName + ".png");try {f.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}FileOutputStream fOut = null;try {fOut = new FileOutputStream(f);} catch (FileNotFoundException e) {e.printStackTrace();}mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);try {fOut.flush();} catch (IOException e) {e.printStackTrace();}try {fOut.close();} catch (IOException e) {e.printStackTrace();}}
一,相关概念
1,Bitmap,位图也就是位的数组,扩展名为.bmp的不带压缩的点阵图,也就是一种图片信息存储对象。
2,Drawable,就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象。实际上它是android平台的通用对象,用来装载png,jpg,gif,bmp等各种常见的图片资源。
3,Canvas,绘图的目的区域,任何要展现的形状或效果都需要它作为背景。可以通过它来对bitmap进行裁剪转化等操作。一般draw这个动作由canvas发起:canvas.drawCircle
4,Paint,画笔,设置颜色抗锯齿什么的。
二,Bitmap
1,从资源中获取bitmap
Resources res = getResources();Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
2,bitmap -> byte[]
public byte[] BitmapToBytes(Bitmap bitmap) {<span style="white-space:pre"></span>ByteArrayOutputStream mByteArrayOutputStream= new ByteArrayOutputStream();<span style="white-space:pre"></span>bitmap.compress(Bitmap.CompressFormat.PNG, 100, mByteArrayOutputStream);<span style="white-space:pre"></span>return mByteArrayOutputStream.toByteArray();<span style="white-space:pre"></span>}
3,byte[] -> bitmap
public Bitmap BytesToBimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}}
4,bitmap缩放
public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidth = ((float) width / w);float scaleHeight = ((float) height / h);matrix.postScale(scaleWidth, scaleHeight);Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);return newbmp;}
5,drawable -> bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {// 取 drawable 的长宽int w = drawable.getIntrinsicWidth();int h = drawable.getIntrinsicHeight();// 取 drawable 的颜色格式Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565;// 建立对应 bitmapBitmap bitmap = Bitmap.createBitmap(w, h, config);// 建立对应 bitmap 的画布Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, w, h);// 把 drawable 内容画到画布中drawable.draw(canvas);return bitmap;}
6,获得圆角图片
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {int w = bitmap.getWidth();int h = bitmap.getHeight();Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_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);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}
7,获得带倒影图片
public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {final int reflectionGap = 4;int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();matrix.preScale(1, -1);Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,h / 2, matrix, false);Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),Config.ARGB_8888);Canvas canvas = new Canvas(bitmapWithReflection);canvas.drawBitmap(bitmap, 0, 0, null);Paint deafalutPaint = new Paint();canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);Paint paint = new Paint();LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,0x00ffffff, TileMode.CLAMP);paint.setShader(shader);// Set the Transfer mode to be porter duff and destination inpaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));// Draw a rectangle using the paint with our linear gradientcanvas.drawRect(0, h, w, bitmapWithReflection.getHeight()+ reflectionGap, paint);return bitmapWithReflection;}
public static Bitmap createReflectedImage(Bitmap originalImage) { int width = originalImage.getWidth(); int height = originalImage.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 0, width, height, matrix, false); final Canvas canvas = sCanvas; canvas.setBitmap(reflectionImage);Paint shaderPaint = new Paint();LinearGradient shader = new LinearGradient(0, 0, 0, height, 0x70ffffff,0x00ffffff, TileMode.MIRROR);shaderPaint.setShader(shader);shaderPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));canvas.drawRect(0, 0, width, height, shaderPaint);canvas.setBitmap(null); return reflectionImage; }
8.Bitmap存入SD
三,Drawable
1,bitmap -> drawable
Bitmap bm=xxx; //xxx根据你的情况获取BitmapDrawable bd= new BitmapDrawable(getResource(), bm); 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
2,drawable缩放
public static Drawable zoomDrawable(Drawable drawable, int w, int h) {int width = drawable.getIntrinsicWidth();int height = drawable.getIntrinsicHeight();// drawable转换成bitmapBitmap oldbmp = drawableToBitmap(drawable);// 创建操作图片用的Matrix对象Matrix matrix = new Matrix();// 计算缩放比例float sx = ((float) w / width);float sy = ((float) h / height);// 设置缩放比例matrix.postScale(sx, sy);// 建立新的bitmap,其内容是对原bitmap的缩放后的图Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,matrix, true);return new BitmapDrawable(newbmp);}
canvas.translate(.1f * drawableNormal.getIntrinsicWidth() / 2, .1f * drawableNormal.getIntrinsicHeight() / 2);canvas.scale(.9f, .9f);drawableNormal.draw(canvas);//缩放时要连带作translate
更多相关文章
- Android积木之图片的生成和保存
- IDEA和Android Studio设置自定义背景图片
- android图片压缩工具类分享
- 『ANDROID』Android实现圆形的图片边角
- PC客户端与Android实现图片传送
- android_常用UI控件_02_EditText_01添加图片到edittext中
- Android 图片点击 全屏缩放预览
- Android富文本图文混排、粗体、斜体、图片、下划线、删除线等