libpng读取PNG8和PNG24的区别

2024-04-16 18:18
文章标签 读取 区别 libpng png8 png24

本文主要是介绍libpng读取PNG8和PNG24的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PNG8和PNG24最大的不同就在于透明度,PNG8只有一位存储透明度,PNG24有8位。这也就影响了PNG数据块的数据格式大小。在libpng中提供了检测设置的方法。

// expand any tRNS chunk data into a full alpha channel
if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) {png_set_tRNS_to_alpha(pngPtr);LOGD("png_set_tRNS_to_alpha");
}

这个检测来自于libpng官方教程,检测透明度如果不够,那么会补齐数据格式。另外libpng还提供了额外的一些检测和设置。

// force palette images to be expanded to 24-bit RGB
// it may include alpha channel
if (colorType == PNG_COLOR_TYPE_PALETTE) {png_set_palette_to_rgb(pngPtr);LOGD("png_set_palette_to_rgb");
}// low-bit-depth grayscale images are to be expanded to 8 bits
if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {png_set_expand_gray_1_2_4_to_8(pngPtr);LOGD("png_set_expand_gray_1_2_4_to_8");
}// expand any tRNS chunk data into a full alpha channel
if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) {png_set_tRNS_to_alpha(pngPtr);LOGD("png_set_tRNS_to_alpha");
}// reduce images with 16-bit samples to 8 bits
if (bitDepth == 16) {png_set_strip_16(pngPtr);
}// expand grayscale images to RGB
if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {png_set_gray_to_rgb(pngPtr);LOGD("png_set_gray_to_rgb");
}

所有的设置,都必须在png_read_update_info函数调用之前,才能起作用。

最后,关于png的一些信息获取,png_get_IHDR是针对32位图片的,那么16位图片就会有问题。我们需要用别的方法调用确保正确性。

/* Note that png_get_IHDR() returns 32-bit data into* the application's width and height variables.* This is an unsafe situation if these are 16-bit* variables*/
width     = png_get_image_width(pngPtr, infoPtr);
height    = png_get_image_height(pngPtr, infoPtr);
bitDepth  = png_get_bit_depth(pngPtr, infoPtr);
colorType = png_get_color_type(pngPtr, infoPtr);


这篇关于libpng读取PNG8和PNG24的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909535

相关文章

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName