- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,所以在 photoshop 中,我创建了一个具有透明背景和一些文本的 8 位彩色图像。然后我创建了一个具有透明背景和一些文本的 16 位颜色的图像。
当我右键单击两个图像并转到属性时,它显示两个图像都是 32 位深度 :l所以我决定使用以下设置使用 LibPng 读取图像:
typedef union RGB //Holds all the pixels..
{
uint32_t Color;
struct
{
unsigned char B, G, R, A;
} RGBA;
} *PRGB;
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);
png_set_interlace_handling(PngPointer);
png_set_strip_16(PngPointer);
png_set_packing(PngPointer);
switch (colortype)
{
case PNG_COLOR_TYPE_GRAY:
{
png_set_expand_gray_1_2_4_to_8(PngPointer);
png_set_expand(PngPointer);
png_set_bgr(PngPointer);
break;
}
case PNG_COLOR_TYPE_PALETTE:
{
png_set_palette_to_rgb(PngPointer);
if (png_get_valid(PngPointer, InfoPointer, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(PngPointer);
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
png_set_bgr(PngPointer);
BitsPerPixel = 24;
break;
}
case PNG_COLOR_TYPE_GRAY_ALPHA:
{
png_set_gray_to_rgb(PngPointer);
break;
}
case PNG_COLOR_TYPE_RGB:
{
png_set_bgr(PngPointer);
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
BitsPerPixel = 24;
break;
}
case PNG_COLOR_TYPE_RGBA:
{
png_set_bgr(PngPointer);
BitsPerPixel = 32;
break;
}
default: png_destroy_read_struct(&PngPointer, &InfoPointer, nullptr); throw std::runtime_error("Error: Png Type not supported."); break;
}
//SET BACKGROUND
/*png_color_16 my_background, *image_background;
my_background.red = 255;
my_background.green = 255;
my_background.blue = 255;
image_background = &my_background;
if (png_get_bKGD(PngPointer, InfoPointer, &image_background))
{
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
png_set_background(PngPointer, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
}
else
{
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
png_set_background(PngPointer, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
}*/
//END SET BACKGROUND
png_read_update_info(PngPointer, InfoPointer);
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);
我的保存设置是:
png_set_write_fn(PngPointer, reinterpret_cast<void*>(&hFile), WriteToStream, nullptr);
png_set_IHDR (PngPointer, InfoPointer, width, height, bitdepth, BitsPerPixel == 24 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(PngPointer, InfoPointer);
png_set_bgr(PngPointer);
png_set_packing(PngPointer);
png_set_interlace_handling(PngPointer);
if (colortype == PNG_COLOR_TYPE_RGB) png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
PNG 看起来像:
当我通过 C++ 将它保存为位图时,它看起来像(8 位的一个这样做):
将其另存为 PNG,它看起来与原始文件完全一样。 8 和 16 都可以保存回来。
问题是,如果我取消注释“SetBackground”部分,它可以完美地保存为位图,除了当我将它保存回 PNG 时,背景不再透明,因为代码将它设置为白色 (255, 255 , 255).
我该如何解决这个问题?
最佳答案
我对您的代码进行了一些更改。 未经测试!
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);
png_set_interlace_handling(PngPointer);
png_set_strip_16(PngPointer);
png_set_packing(PngPointer);
bool BGneeded = (colortype > PNG_COLOR_TYPE_PALETTE);
switch (colortype)
{
case PNG_COLOR_TYPE_GRAY:
{
png_set_expand_gray_1_2_4_to_8(PngPointer);
//png_set_expand(PngPointer);
//png_set_bgr(PngPointer); //R=G=B so there's no need to swap RGB values
png_set_gray_to_rgb(PngPointer);
break;
}
case PNG_COLOR_TYPE_PALETTE:
{
png_set_palette_to_rgb(PngPointer);
if (png_get_valid(PngPointer, InfoPointer, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(PngPointer);
BGneeded = true;
}
else
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
png_set_bgr(PngPointer);
BitsPerPixel = 32;
break;
}
case PNG_COLOR_TYPE_GRAY_ALPHA:
{
png_set_gray_to_rgb(PngPointer);
break;
}
case PNG_COLOR_TYPE_RGB:
{
png_set_bgr(PngPointer);
png_set_filler(PngPointer, 0xFF, PNG_FILLER_AFTER);
BitsPerPixel = 32;
break;
}
case PNG_COLOR_TYPE_RGBA:
{
png_set_bgr(PngPointer);
BitsPerPixel = 32;
break;
}
default: png_destroy_read_struct(&PngPointer, &InfoPointer, nullptr); throw std::runtime_error("Error: Png Type not supported."); break;
}
//SET BACKGROUND
png_color_16 my_background;
png_color_16p image_background;
my_background.red = 255;
my_background.green = 255;
my_background.blue = 255;
if (png_get_bKGD(PngPointer, InfoPointer, &image_background))
png_set_background(PngPointer, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
else if (BGneeded)
png_set_background(PngPointer, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
//END SET BACKGROUND
png_read_update_info(PngPointer, InfoPointer);
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);
关于c++ - LibPng 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024240/
我有一个带 LCD 显示屏的微 Controller 。我需要显示几个 PNG 图像。由于微 Controller 的性能有限,显示图像的时间过长。 我做了基准测试并检测到大部分时间花在 libpng
我有一个应用程序依赖于过多的库(不是我们都依赖)。大多数这些库都是通过包管理器安装的。对于那些不是的,我重新编译了它们,但我仍然得到相同的 libpng 不兼容错误。 libpng warning:
我通过安装 matplotlib pip install matplotlib 当我尝试用它保存 png 时,我得到了 Application was compiled with png.h from
我收到一封来自 Google Play 商店的电子邮件,内容涉及“Google Play 警告:您正在使用易受攻击的 libpng 版本”。 电子邮件包含以下信息 - https://support.
我正在尝试将 libpng-1.16.6 构建为 VS 2010 的静态库。我想我已经排除了 makefile 语法问题、文件系统权限和不正确的 LIB/LIBPATH 环境变量。 makefile
我从 https://github.com/sourabhv/FlapPyBird 安装了 FlapPyBird 存储库.我已经安装了 libpng,但是当我尝试使用 python flappy.py
我从 https://github.com/sourabhv/FlapPyBird 安装了 FlapPyBird 存储库.我已经安装了 libpng,但是当我尝试使用 python flappy.py
我从 libpng 文档中获取了以下代码:此外,如果它有任何用处,此代码位于从基于 gtkmm 的应用程序调用的类中。 FILE *fp = fopen(path.c_str(), "rb"); if
我的应用程序用于使用 wifi 进行实时视频流和录制(音频和视频)。使用以下依赖项: repositories { maven { url 'https://raw.github.com/iParse
好的,所以在 photoshop 中,我创建了一个具有透明背景和一些文本的 8 位彩色图像。然后我创建了一个具有透明背景和一些文本的 16 位颜色的图像。 当我右键单击两个图像并转到属性时,它显示两个
我似乎无法让 libpng 将其数据转储到我的结构中。我不知道我做错了什么。我正在尝试翻转字节,因为 PNG 是自上而下存储的,我需要自下而上的数据。 首先我的结构看起来像: typedef unio
我正在尝试在 Mac OS X Yosemite 上使用 libpng 编译一个项目。 我得到了错误: Undefined symbols for architecture x86_64: "_p
我正在尝试掌握 libpng 中的基本功能。为此,我使用了 this snippet并适应我自己的例子。 int x, y; png_byte color_type = PNG_COLOR_TYPE_
我在尝试编译时遇到以下错误.... Undefined symbols for architecture x86_64: "_png_sig_cmp", referenced from: Render
我已按照苔丝二号的搭建说明进行操作 Github 我成功地使用 NDK 构建了 tess-two 并导入了库我正在尝试运行在同一存储库中提供的测试应用程序,但每当应用程序启动时,它都会出现以下异常:一
我已经通读了文档和示例,但在我的实现过程中,我无法做到正确。 问题:使用以下代码,写入的.png 将透明区域转换为纯白色。我试图将生成的 .png 覆盖在另一个带有颜色的图像之上,但由于不透明,底层图
下载源代码并将配置更改为 Release Library x64 并点击构建。它构建得很好,并且通过了一些测试。 然后我在我的项目中引用了 libpng(和 zlib 以避免一些任意错误),它构建得很
OS: centos-release-6-10.el6.centos.12.3.x86_64 Node version: v8.11.1 NPM version: 5.6.0 包.json { "
我正在使用 libpng 读取图像。图像本身有 4 个 channel (rgba), channel 有 8 位。我想将其作为灰度图像读取,最好是黑白图像(每像素 1 位),但即使是每像素 8 位也
我是 iPhone 开发新手,尝试使用 libpng 加载 PNG,但在尝试了这么多之后无法将其添加到我的项目中。将 libpng 添加到我的项目时出现以下错误。请帮助我如何消除这些错误: “_def
我是一名优秀的程序员,十分优秀!