设置了 Bitmap.Config.RGB_565 无效

项目里面看到一张图片占用内存很大,想优化一下

首先是用了glide,但是发现设置了format 跟不设置是一样的,非常不理解

后面又想用android 原生的API 来解析图片,以为这样就可以生效了

 BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bitmap, options);
            Log.i("bitmap", "name: " + bitmap.getConfig().name());

但通过内存分析发现无论我设置成什么占用内存大小都是一样的!!后面打印了bitmap 的config 才发现原来没改成功!

使用Glide 也是一样的效果

   private void loadBitmap(int width, int height, ImageView imageView, int resId) {
        Glide.with(this).load(resId).
                asBitmap().format(DecodeFormat.PREFER_RGB_565).
                override(dp2px(this, width), dp2px(this, height)).
                into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        Log.i("bitmap", "onResourceReady: " + resource.getConfig().name());
                    }
                });
    }

打印结果还是显示的是

网上的解决方案:

一、

private Bitmap convert(Bitmap bitmap, Bitmap.Config config) {
    Bitmap convertedBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), config);
    Canvas canvas = new Canvas(convertedBitmap);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    canvas.drawBitmap(bitmap, 0, 0, paint);
    return convertedBitmap;
}

二、 

Bitmap converted = original.copy(Config.RGB_565, false);

偶尔几张图片不能转换还好,但如果很多图片都不支持就很尴尬了,难道要放弃使用glide?目前还没找到哪些图片不支持转换的资料!

要将安卓开发中的 Bitmap.Config.ARGB_4444 格式的位图传递给C++,您需要将该位图转换为C++中的图像格式,并使用OpenCV库在C++中显示该图像。下面是一个简单的示例代码,用于将ARGB_4444图像转换为OpenCV中的Mat格式: ``` // 将Android Bitmap转换为OpenCV Mat cv::Mat bitmapToMat(JNIEnv* env, jobject bitmap) { AndroidBitmapInfo info; void* pixels = 0; cv::Mat dst; try { CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0); CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565 || info.format == ANDROID_BITMAP_FORMAT_RGBA_4444); CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0); CV_Assert(pixels); dst.create(info.height, info.width, CV_8UC4); if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) { cv::Mat tmp(info.height, info.width, CV_8UC4, pixels); tmp.copyTo(dst); } else if (info.format == ANDROID_BITMAP_FORMAT_RGB_565) { cv::Mat tmp(info.height, info.width, CV_8UC2, pixels); cvtColor(tmp, dst, cv::COLOR_BGR5652RGBA); } else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_4444) { cv::Mat tmp(info.height, info.width, CV_8UC2, pixels); cvtColor(tmp, dst, cv::COLOR_BGRA4444_RGBA); } } catch (const cv::Exception& e) { AndroidBitmap_unlockPixels(env, bitmap); jclass je = env->FindClass("org/opencv/core/CvException"); if (!je) je = env->FindClass("java/lang/Exception"); env->ThrowNew(je, e.what()); return dst; } AndroidBitmap_unlockPixels(env, bitmap); return dst; } // 在C++中显示OpenCV Mat void showMat(cv::Mat& mat) { cv::imshow("Image", mat); cv::waitKey(0); } ``` 在您的C++代码中,您可以将ARGB_4444位图转换为OpenCV Mat,然后使用 showMat 函数在窗口中显示它: ``` jobject bitmap = ... // 获取ARGB_4444格式的Bitmap对象 cv::Mat mat = bitmapToMat(env, bitmap); showMat(mat); ``` 请注意,您需要在C++中包含以下头文件才能使用这些函数: ``` #include <jni.h> #include <android/bitmap.h> #include <opencv2/opencv.hpp> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值