`

Bitmap之RGB_565

 
阅读更多

Bitmap 颜色模式RGB_565每个像素占2字节的内存,特点是没有透明度,即alpha值

这里我们来讨论其没有透明度细节

结论是:其有透明度呀
测试写的自定义View:

public class MyImageView extends ImageView {
    private Paint paint;

    public MyImageView(Context context) {
        super(context);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setAlpha(255);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds=true;
        BitmapFactory.decodeResource(getResources(), R.mipmap.sauce, options);
        options.inPreferredConfig= Bitmap.Config.RGB_565;
        options.inJustDecodeBounds=false;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sauce, options);
        canvas.drawBitmap(bitmap,0,0,paint);
    }}

效果:

效果图1



效果图2


无法得出结论

1.背景为红色,为了验证其RGB_565是否支持PNG图片的透明像素,答案是支持。
2.两张图片其透明度有变化,通过设置paint的alpha,一个是255,一个是100,与RGB_565不支持alpha主流观点不太一样。

在此感觉好郁闷,希望有大神告诉我原因,是我验证方式有问题吗?

文中测试图片



分隔线


后续

群里,一个热心的朋友回答了我,挺有道理的,也解决了我前面论证的不足,下面是原话:

rbg_565验证的是图片本身没有透明通道,但画笔设置为透明,会影响显示的透明度,而图片本身仍是木有透明通道,不知道这样理解对不对 笑哭

于是,我在MainActivity加入了如下代码测试

MyImageView imageView = (MyImageView) findViewById(R.id.iv);
Toast.makeText(this,imageView.getAlpha()+"",Toast.LENGTH_LONG).show();

测试结果,无论如何修改paint.setAlpha()的值,Toast弹出的都是1.0。

写到这里,已经证明了,我前面说的,RGB_565有透明度是不准确的,但还是无法证明其到底是否有透明度,我会继续验证



分隔线


经过自己的努力,终于有一点眉目了。
修改后的MyImageView


public class MyImageView extends ImageView {


    public MyImageView(Context context) {
        super(context);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sauce);
        Bitmap bitmap1 = bitmap.copy(Bitmap.Config.RGB_565, true);
        canvas.drawBitmap(bitmap1,0,0,new Paint());
    }
}

效果图如下:
这是默认的,即ARGB_8888

默认



这是RGB_565的:

RGB565


这下终于看出眉目了吧,把bitmap颜色模式改成RGB_565之后,本来有透明像素的位图变得没有透明像素,透明像素被黑色取代,所以我怀疑原来的代码是错的,方式是错的,原来我或许并没有修改到图片的颜色模式。


暂时的结论


RGB_565是没有透明属性的,有透明像素的位图,设置成此模式后,透明像素会变为黑色。


在验证中发现的问题


bitmap.getAllocationByteCount()并不能获取到Bitmap占用的内存大小,因为会报空指针异常,至于为什么,我不知道。
获取其占用内存大小,可以图片长度*图片宽度*4,这个只针对其默认的颜色模式ARGB_8888,其它颜色模式同理可得。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    android.graphics.Bitmap.Config<ALPHA_8, ARGB_4444,ARGB_8888,RGB_565>

    在`Bitmap.Config`中,`ALPHA_8`, `ARGB_4444`, `ARGB_8888`, 和 `RGB_565`是四种常见的配置选项。 1. **ALPHA_8**: 这个配置只存储每个像素的透明度(Alpha)信息,没有颜色信息。它主要用于需要透明效果但对...

    C# Bitmap转RGB32(NI)

    2. **创建一个新的Bitmap实例**: 由于默认的Bitmap可能不是RGB32格式,我们需要创建一个新的Bitmap实例,指定宽度、高度和 PixelFormat 为 Format32bppArgb(即RGB32带Alpha通道)。 ```csharp Bitmap newBitmap = ...

    直接在RGB图片上画直线矩形多边形写字-bitmap_plot_v1_2.zip

    直接在RGB图片上画直线矩形多边形写字-bitmap_plot_v1_2.zip 使用方法: 首先使用正常的imread函数,把你的图片读到工作空间里: I=imread;  % 画一条直线  x=rand*50 50; y=linspace;  I=...

    rgb565_to_bmp

    本篇文章将详细介绍一个名为“rgb565_to_bmp”的工具,它能将RGB565格式的图像转换为常见的24位色彩BMP文件格式(RGB888)。 RGB565格式是用于存储16位像素的彩色图像,其中R(红色)、G(绿色)和B(蓝色)各占5位...

    vgademo_bitmap_vhdl_vga_

    【vgademo_bitmap_vhdl_vga_】是一个基于VHDL设计的项目,主要用于在Basys3 FPGA开发板上实现VGA(Video Graphics Array)显示功能。VHDL是一种硬件描述语言,常用于数字电子系统的设计,包括FPGA(Field-...

    视频图片RGB获取_rgb_

    3. **图像和视频处理**:在C#中,可以使用Bitmap类来表示和操作图像,每个像素都可以通过Bitmap的GetPixel方法获取,返回的是Color结构体,包含了像素的RGB值。对于视频处理,可以使用DirectShow或Media Foundation...

    Bitmap_Conversion.rar_VC conversi_bitmap_mosaic_图像 转换_对比度

    Bitmap Conversion是一个基于VC++的项目,它专注于图像处理,特别是图像转换方面,提供了多种功能,如像素灰度处理、对比度调整、马赛克效果应用以及柔化和波形扰动效果。这些功能在图像处理领域有着广泛的应用,...

    bmp格式转为rgb565格式图片转换工具

    "bmp格式转为rgb565格式图片转换工具"正是针对这种需求而设计的。BMP(Bitmap)是一种常见的位图格式,它存储了图像的每一个像素信息,包括颜色深度、透明度等。然而,这种格式在内存占用和处理速度上并不理想,特别...

    Bitmap_光栅_位图_

    位图(Bitmap)是一种常见的图像文件格式,广泛用于计算机图形处理和数字图像领域。它是由像素阵列组成的,每个像素代表图像中一个特定位置的颜色信息。位图图像的优点在于能够表现丰富的细节和色彩层次,但缺点是...

    uC-GUI-BitmapConvert.rar_BitmapConvert_GUI Bitmap_uc_uc bitmap_v

    注意,输入的.bmp文件应符合标准的位图格式,通常包含RGB色彩信息或者灰度信息。 3. 在工具中设定输出参数,如位图数据的存储格式、颜色深度等。根据你的硬件平台和uC-GUI配置,选择最适合的选项。 4. 点击“转换”...

    VB6_Bitmap_Quantiser_Quantiser_quantisation_writtendl3_effect_vb

    标题“VB6_Bitmap_Quantiser_Quantiser_quantisation_writtendl3_effect_vb”和描述“Quantisation Special Effect Quantiser Bitmap VB6”都指向一个使用Visual Basic 6(VB6)开发的图像处理程序,该程序实现了...

    位图与调色板bitmap_picture_demo

    在8位或更低色彩深度的系统中,由于可用的颜色数量有限,调色板被用来存储这些有限颜色的RGB(红绿蓝)值。每个像素的值实际上是一个索引,指向调色板中的某个颜色。例如,一个8位的位图只能显示256种不同的颜色,这...

    bmp_from_24bitmap_to_8bitmap

    BMP(Bitmap)是一种常见的位图图像格式,广泛用于Windows操作系统中。从24位色彩的BMP文件转换为8位色彩的BMP文件涉及到颜色深度的降低,这在处理大量图像数据时尤其重要,因为8位BMP文件通常比24位文件更小,占用...

    YUV420图像数据转换成RGB888和RGB565位图文件

    将YUV420图像数据转换成RGB888和RGB565位图文件;包含YUV420解码算法;YUV数据到RGB数据的转换算法;生成RGB888位图和RGB565位图的BITMAP文件格式算法;相关算法与函数都有详细的注释信息。

    BMP_RGB.rar_BGR BMP_BMP rgb bgr_bmp RGB_rgb 存储 bmp_读取bmp

    在计算机图形学中,BMP(Bitmap)是一种常见的位图图像文件格式,广泛应用于Windows操作系统。这个主题主要涉及如何读取BMP文件以及理解BMP文件的内部结构,特别是颜色通道——红色、绿色和蓝色(RGB)之间的转换,...

    Bitmap_transform.rar_Bitmap Transform_bitmap

    1. **从数组到Bitmap**: 一个二维数组可以表示图像的像素值,通常每个元素代表一个像素的RGB值。将这个数组转换为Bitmap,需要创建一个新的Bitmap对象,设置其宽度和高度,然后遍历数组,用`SetPixel`方法设置每个...

    RGB565直接转BMP

    你提供的压缩包文件"RGB565_2_BMP"可能包含了实现这一转换的代码示例或者工具,可以用于参考或直接使用。学习并理解这个转换过程对于理解图像处理和文件格式转换有很好的帮助,同时也对从事嵌入式系统开发或者图形...

    Android人脸识别功能使用源码

    在代码实现上,你需要创建一个函数来处理图像,该函数会接收RGB_565格式的Bitmap对象作为输入。然后,使用OpenCV的`Mat`类转换Bitmap到OpenCV能处理的格式。在转换过程中,由于RGB_565的颜色深度较低,我们需要确保...

    Open_BITmap.rar_open

    3. 颜色索引:由于8位图使用颜色索引,程序需要有一个颜色查找表(Color Look-Up Table, CLUT),将每个8位值映射到对应的RGB颜色值。如果图像是灰度图像,则每个索引代表一种灰度级别。 4. 显示渲染:最后,程序将...

Global site tag (gtag.js) - Google Analytics