Bitmap的复制和注意

Bitmap是不能通过“ A = B ”来传递的,这样只是把B的引用给了A而已
之前做截图的时候就遇到过这个问题,但是没注意,想把截图获得的bitmap给ImageView显示,然后回收。发现报错后,就用“ = ”的方法新建了个A,同时回收B。发现还是报错,然后才想起来这个知识点。那么通过什么方法能够把Bitmap给复制过去呢?
ps:这里也说一下,不要把Bitmap像我上面那样给ImageView显示,我是为了调试的时候能更直观的看到,实际情况中,分享界面跟主界面是两个activity,这样Bitmap在分享结束后能够及时回收


复制有两个方法:
第一:copy方法:
根据该位图的大小产生一个新位图,根据指定的结构设置新位图的结构,然后把位图的像素拷贝到新位图中。如果不支持该转换,或者分配内存失败,那就返回NULL。返回的位图和原图有同样的像素密度。
参数
  config   结果图预期的结构;
  isMutable   如果是true,那么产生的图片是可变的。(比如,它的像素能被修改)
  返回值 新的位图。如果拷贝操作不能执行,则返回NULL。
  

Bitmap alterBitmap=screenBmp.copy(Bitmap.Config.ARGB_8888, true);

ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位


第二:新建空白bitmap,然后绘制(优点:可以进行自定义的处理)

//创建原图的一个副本。 可修改  创建的是一个空白的图形。
        Bitmap alterBitmap = Bitmap.createBitmap(screenBmp.getWidth() * 2, screenBmp.getHeight() * 2, screenBmp.getConfig());
        //1.准备一个画板  在上面放上准备好的 空白的位图
        Canvas canvas = new Canvas(alterBitmap);
        //2.准备一个画笔
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        //3.画画
        Matrix m = new Matrix();
        m.setScale(2.0f, 2.0f);
        canvas.drawBitmap(screenBmp, m, paint);
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实现Mat和Bitmap的相互转换,可以通过以下代码实现: ```c #include <opencv2/opencv.hpp> #include <android/bitmap.h> using namespace cv; bool matToBitmap(JNIEnv *env, Mat &src, jobject bitmap) { AndroidBitmapInfo bitmapInfo; void *pixels; int ret; // 获取bitmap信息 if ((ret = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo)) < 0) { return false; } // 锁定bitmap并获取pixels指针 if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { return false; } // 将Mat转换为Bitmap复制到pixels中 if (bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888) { Mat tmp; cvtColor(src, tmp, COLOR_BGR2RGBA); memcpy(pixels, tmp.data, tmp.elemSize() * tmp.total()); } else { Mat tmp; cvtColor(src, tmp, COLOR_BGR2RGB); memcpy(pixels, tmp.data, tmp.elemSize() * tmp.total()); } // 解锁bitmap AndroidBitmap_unlockPixels(env, bitmap); return true; } bool bitmapToMat(JNIEnv *env, jobject bitmap, Mat &dst) { AndroidBitmapInfo info; void *pixels; int ret; // 获取bitmap信息 if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) { return false; } // 锁定bitmap并获取pixels指针 if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { return false; } // 保存Bitmap中的像素数据到Mat中 if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) { Mat tmp(info.height, info.width, CV_8UC4, pixels); cvtColor(tmp, dst, COLOR_RGBA2BGR); } else { Mat tmp(info.height, info.width, CV_8UC2, pixels); cvtColor(tmp, dst, COLOR_RGB2BGR); } // 解锁bitmap AndroidBitmap_unlockPixels(env, bitmap); return true; } ``` 这里使用了OpenCV库中的cvtColor函数来实现Mat与Bitmap之间的颜色格式转换,将Mat中的数据以RGB或RGBA格式保存到Bitmap中。在转换过程中,需要注意的是两种数据结构的行列排列方式不同,需要在复制时做出调整,否则会出现结果不正确的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值