一、相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象
2、Canvas画布,绘图的目的区域,用于绘图
3、Bitmap位图,用于图的处理
4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

  1. Resources res = getResources();
  2. Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);

2、Bitmap → byte[]

  1. public byte[] Bitmap2Bytes(Bitmap bm) {
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
  4. return baos.toByteArray();
  5. }

3、byte[] → Bitmap

  1. public Bitmap Bytes2Bimap(byte[] b) {
  2. if (b.length != 0) {
  3. return BitmapFactory.decodeByteArray(b, 0, b.length);
  4. } else {
  5. return null;
  6. }
  7. }

4、Bitmap缩放

  1. public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Matrix matrix = new Matrix();
  5. float scaleWidth = ((float) width / w);
  6. float scaleHeight = ((float) height / h);
  7. matrix.postScale(scaleWidth, scaleHeight);
  8. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  9. return newbmp;
  10. }

5、将Drawable转化为Bitmap

  1. public static Bitmap drawableToBitmap(Drawable drawable) {
  2. // 取 drawable 的长宽
  3. int w = drawable.getIntrinsicWidth();
  4. int h = drawable.getIntrinsicHeight();
  5. // 取 drawable 的颜色格式
  6. Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
  7. : Bitmap.Config.RGB_565;
  8. // 建立对应 bitmap
  9. Bitmap bitmap = Bitmap.createBitmap(w, h, config);
  10. // 建立对应 bitmap 的画布
  11. Canvas canvas = new Canvas(bitmap);
  12. drawable.setBounds(0, 0, w, h);
  13. // 把 drawable 内容画到画布中
  14. drawable.draw(canvas);
  15. return bitmap;
  16. }

6、获得圆角图片

  1. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
  5. Canvas canvas = new Canvas(output);
  6. final int color = 0xff424242;
  7. final Paint paint = new Paint();
  8. final Rect rect = new Rect(0, 0, w, h);
  9. final RectF rectF = new RectF(rect);
  10. paint.setAntiAlias(true);
  11. canvas.drawARGB(0, 0, 0, 0);
  12. paint.setColor(color);
  13. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  14. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  15. canvas.drawBitmap(bitmap, rect, rect, paint);
  16. return output;
  17. }

7、获得带倒影的图片

  1. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
  2. final int reflectionGap = 4;
  3. int w = bitmap.getWidth();
  4. int h = bitmap.getHeight();
  5. Matrix matrix = new Matrix();
  6. matrix.preScale(1, -1);
  7. Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,
  8. h / 2, matrix, false);
  9. Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),
  10. Config.ARGB_8888);
  11. Canvas canvas = new Canvas(bitmapWithReflection);
  12. canvas.drawBitmap(bitmap, 0, 0, null);
  13. Paint deafalutPaint = new Paint();
  14. canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);
  15. canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);
  16. Paint paint = new Paint();
  17. LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
  18. bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
  19. 0x00ffffff, TileMode.CLAMP);
  20. paint.setShader(shader);
  21. // Set the Transfer mode to be porter duff and destination in
  22. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  23. // Draw a rectangle using the paint with our linear gradient
  24. canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()
  25. + reflectionGap, paint);
  26. return bitmapWithReflection;
  27. }

三、Drawable

1、Bitmap转换成Drawable

  1. Bitmap bm=xxx; //xxx根据你的情况获取
  2. BitmapDrawable bd= new BitmapDrawable(getResource(), bm);
  3. 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。

2、Drawable缩放

    1. public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
    2. int width = drawable.getIntrinsicWidth();
    3. int height = drawable.getIntrinsicHeight();
    4. // drawable转换成bitmap
    5. Bitmap oldbmp = drawableToBitmap(drawable);
    6. // 创建操作图片用的Matrix对象
    7. Matrix matrix = new Matrix();
    8. // 计算缩放比例
    9. float sx = ((float) w / width);
    10. float sy = ((float) h / height);
    11. // 设置缩放比例
    12. matrix.postScale(sx, sy);
    13. // 建立新的bitmap,其内容是对原bitmap的缩放后的图
    14. Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
    15. matrix, true);
    16. return new BitmapDrawable(newbmp);
    17. }

最新文章

  1. 2-SAT
  2. 对CVE-2014-6271 [破壳漏洞] 的一次不太深入的跟踪
  3. jsrender for array 和for object语法
  4. 第2月第3天 egorefresh
  5. 模拟Linux的shell
  6. c语言typedef的用法-解惑阿!很多天书般的东西解释的不错(转)
  7. Codeforces Round #221 (Div. 2) Lever I.O.U.
  8. NEsper使用的事件类型 z
  9. java web 文件上传下载
  10. 编写最简单的 iPhone 界面切换应用
  11. Sql"列转行"三种方法对比
  12. drupal7 开发自定义上传、下载模块的上传功能
  13. java学习笔记——IO部分(遍历文件夹)
  14. java I/O框架 (四)文件流
  15. string和c_str()使用时的坑
  16. k-d tree模板练习
  17. LeetCode之“链表”:Linked List Cycle && Linked List Cycle II
  18. html实体命名
  19. 四、自动化平台搭建-Django-如何做验证码
  20. zabbix3.4监控Linux客户端

热门文章

  1. Scrapy笔记08- 文件与图片
  2. 26 配置TensorFlow 1.9
  3. js面向对象的笼统介绍
  4. C 题解———2019.10.16
  5. centos6中安装新版 Elasticsearch 7.x
  6. 【数位DP】【P4317】花神的数论题
  7. 1-5docker私有镜像仓库
  8. 【07月02日】A股滚动市盈率PE最低排名
  9. Python3+WebSockets实现WebSocket通信
  10. 【剑指offer】构建乘积数组