关于bitmap的赋值和复制【谨记】

12 篇文章 0 订阅

       起初我以为bitmap的复制只是用“=”号做连接。。。其实大错特错

bitmapA=bitmapB 并不能把b复制给a。 而是将b的引用赋值给a。。。。因为我做了这样的试验,证明了这点。


mFilterGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                mSharedData.mFilter = position; //设置哪一个滤镜
                //设置滤镜对比度 亮度 饱和度 等参数
                mSharedData.mImageData=data;
          //      mTempBitmap=mCurrentBitmap.copy(Bitmap.Config.ARGB_8888,true);//把当前bitmap赋值给待滤镜处理的bitmap
                mTempBitmap=mCurrentBitmap;
                mInstaCamRS.applyFilter(mTempBitmap,mSharedData);
                editImage.setImageBitmap(mCurrentBitmap);
            }
        });
这段代码的意思是应用滤镜在bitmap上。最后的结果是mCurrentBitmap不断被加载。。。

分析:

若mCurrentBitmap赋值给了mTempBitmap那editImage.setImageBitmap(mCurrentBitmap);应该报空。但是结果没有,因为他不是int型数据,而是一个对象,

明明处理的是mTempBitmap,但是结果却在mCurrentBitmap生效。

这就证明了,mTempBitmap=mCurrentBitmap;是把mCurrentBitmap的引用赋给了mTempBitmap,

因此对mTempBitmap进行处理,就相当于对mCurrentBitmap进行处理。

而mCurrentBitmap始终没被重新赋值,因此滤镜就叠加 了。

结果:

正确的方法应该是把注释那段代码加上,把他后面的一行去掉。在editImage.setImageBitmap(mTempBitmap);

哎,copy才是复制。才能真正将后者的rgb数组赋值给前面的bitmap。

或者用decode方法构建bitmap,那样才叫赋值

特此写一篇博客,谨记!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
将一个 Bitmap 对象赋值给另一个 Bitmap 对象,可以使用 `Bitmap.copy()` 方法。这个方法会创建一个新的 Bitmap 对象,并将原始 Bitmap 对象的图像数据复制到新的 Bitmap 对象中。然后,可以回收原始的 Bitmap 对象占用的内存。 以下是一个示例代码: ``` Bitmap originalBitmap = ...; // 原始的 Bitmap 对象 Bitmap newBitmap = originalBitmap.copy(originalBitmap.getConfig(), true); // 创建新的 Bitmap 对象,并复制原始 Bitmap 对象的图像数据 originalBitmap.recycle(); // 回收原始 Bitmap 对象占用的内存 originalBitmap = null; // 将变量置为 null,方便垃圾回收 ``` 需要注意的是,在使用 `Bitmap.copy()` 方法创建新的 Bitmap 对象时,需要指定 Bitmap.Config 参数和 boolean 参数。其中,Bitmap.Config 参数指定新的 Bitmap 对象的像素格式,boolean 参数指定新的 Bitmap 对象是否应该是可变的(即是否可以修改图像数据)。如果将 boolean 参数设置为 true,新的 Bitmap 对象就是可变的。 在回收原始的 Bitmap 对象占用的内存时,可以使用 `Bitmap.recycle()` 方法。但是,如果新的 Bitmap 对象是可变的,就不能在回收原始的 Bitmap 对象之前回收新的 Bitmap 对象占用的内存。否则,新的 Bitmap 对象的图像数据就会丢失。 因此,在将一个 Bitmap 对象赋值给另一个 Bitmap 对象并回收原始的 Bitmap 对象占用的内存时,需要先检查新的 Bitmap 对象是否是可变的,然后再决定是否需要回收它占用的内存。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值