加载RGB PNG会导致黑色图像
Loading RGB PNG results in black image
我正在使用libpng库将png文件加载到PixelBuffer,这只是一个二维数组或RGBA值。
下面的代码适用于包含alpha通道的图像,但不适用于不包含alpha通道的图像。
PixelBuffer *IOManager::load_png_to_pixel_buffer(const char *file_name) {
FILE *infile;
char header[8];
bool alphaFlag = false;
if ((infile = fopen(file_name, "rb")) == NULL) {
std::cout << "Could not open file: " << file_name << std::endl;
return nullptr;
}
fread(header, 1, 8, infile);
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr){
std::cout << "Could not create PNG read struct" << std::endl;
return nullptr;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr){
std::cout << "Could not create PNG info struct" << std::endl;
return nullptr;
}
png_init_io(png_ptr, infile);
png_set_sig_bytes(png_ptr, 8);
png_read_info(png_ptr, info_ptr);
int width = png_get_image_width(png_ptr, info_ptr);
int height = png_get_image_height(png_ptr, info_ptr);
png_byte color_type = png_get_color_type(png_ptr, info_ptr);
png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr);
if (bit_depth == 16){
png_set_strip_16(png_ptr);
}
if (color_type == PNG_COLOR_TYPE_PALETTE){
png_set_palette_to_rgb(png_ptr);
}
if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8){
png_set_expand_gray_1_2_4_to_8(png_ptr);
}
if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)){
png_set_tRNS_to_alpha(png_ptr);
}
if(color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_PALETTE){
std::cout << "Setting filler" << std::endl;
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
}
if(color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA){
png_set_gray_to_rgb(png_ptr);
}
png_read_update_info(png_ptr, info_ptr);
PixelBuffer * buffer = new PixelBuffer(width, height,
ColorData(1, 1, static_cast<float>(0.95)));
//png_bytep * row_pointer[width * 4];
png_bytep * row_pointers = new png_bytep[height]();
for (int y=0; y<height; y++){
std::cout << png_get_rowbytes(png_ptr,info_ptr) << std::endl;
row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr));
}
png_read_image(png_ptr, row_pointers);
std::cout << row_pointers << std::endl;
for (int x=0; x<width;x++){
for (int y=0; y < height; y++){
int height_iterator = height - 1;
int r = row_pointers[y][x*4];
int g = row_pointers[y][x*4+1];
int b = row_pointers[y][x*4+2];
int a = row_pointers[y][x*4+3];
if (a == 255)
printf("R: %d G: %d B: %d A: %dn", r, g, b, a);
buffer->set_pixel(x, height_iterator - y, ColorData(r/255,
g/255, b/255,
a/255));
}
}
return buffer;
}
我已经尝试将填充字节翻转到0x0,仍然导致黑色图像。
循环内的printf语句似乎是有效的颜色,我似乎不明白为什么它不工作。
如何让图像加载黑色图像以外的内容?
我假设ColorData接受范围为[0,1]的浮点数。将对ColorData构造函数的调用更改为ColorData(r/255.0f, g/255.0f, b/255.0f, a/255.0f)
,这样您就可以获得浮点值,而不是整数零。
相关文章:
- 具有 GPU 时间表的卤化物产生黑色图像
- openCV中的Absdiff可以编译,但显示黑色图像
- 在图像上的矩形区域之外填充黑色
- 具有SPI_SETDESKWALLPAPER功能的程序仅在尝试使用C++将其更改为图像时将桌面背景更改为黑色
- OpenCv 3.3 Cuda 中值过滤器生成 2/3 的图像黑色
- OPENCV :: CUDA GPUMAT CV_8UC1至CV_32FC1转换黑色图像
- OpenCV,Dlib - 作为黑色图像输出的垫子对象
- 从C++中的屏幕选择创建位图时的黑色图像
- 屏幕截图仅返回黑色图像
- 在C++中,在图像周围填充黑色边框是最有效的方法
- 在opencv中使用imwrite保存图像时,会将图像全部写入黑色,但imshow会正确显示
- 从HWND获取并保存位图(每个像素8,4,1位-黑色图像)
- OpenCV 项目在将直方图应用于黑色图像时崩溃
- SDL产生黑色图像
- 我正在尝试将灰度转换为更大的黑色图像.我得到这个错误OpenCV错误:断言失败
- 在黑色图像上叠加精明的边缘
- 加载RGB PNG会导致黑色图像
- VTKPNGWriter打印黑色图像
- visual截图c++ directx得到黑色图像
- 使用NDK从本机内存恢复图像会返回无显示的黑色图像