4.使用pnglib读写png图片
4.使用pnglib读写png图片
本章前言:
这章就是为了读取png格式图像到32位位图(ARGB)中,逆之则然,废话少说开始正题。
目标要点总结:
最终效果:
Image*img_bg=Image::Create(L"data/img/bg.png");
img_bg->Save_To_PNG(L"bin/bg.png");
前题简要:
具体实现:
首先需要配置pnglib,其中还包括zlib。下载相应源码后,生成静态链接库链接到
项目。在代码中解析图片的cpp包含png.h。下面是解析png图片的具体实现,可结合注释理解。
Image* Image::Create(constString&path)
System_imp* sys =System_imp::Get_Instance();
path.Get_Multi_Byte_Str(temp, 512);
Debug::Instance()->Write_Line(String(L"文件打开失败:")+path);
assert(0 &&L"Image加载时文件打开失败!");
//判断是否为 png文件(用fread读取8字节,然后调用png_sig_cmp判断)
png_bytep header = new png_byte[number];
bool is_png = !png_sig_cmp(header, 0,number);
Debug::Instance()->Write_Line(String(L"只支持png格式的图像读取:")+path);
assert(0 &&L"Image加载时为非png格式图像!");
static png_structppng_ptr =NULL;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
assert(0 &&L"Image加载时初始化pnglib失败!");
png_infop info_ptr = png_create_info_struct(png_ptr);
assert(0 &&L"Image加载时创建png_info失败!");
if (setjmp(png_jmpbuf(png_ptr)))
png_destroy_read_struct(&png_ptr, &info_ptr,png_infopp_NULL);
assert(0 &&L"Image加载时 pnglib出现错误!");
png_set_sig_bytes(png_ptr, 8);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
unsigned w = png_get_image_width(png_ptr, info_ptr); //获得图片宽度
unsigned h = png_get_image_height(png_ptr, info_ptr); //获得图片高度
int color_type = png_get_color_type(png_ptr,info_ptr); //获得图片颜色
row_point = png_get_rows(png_ptr,info_ptr);
int block_size = (color_type == 6 ? 4 : 3);
for (unsignedx = 0;x < h; ++x)
for (unsignedy = 0;y < w*block_size;y +=block_size)
((unsigned char*)img->m_buffer)[pos + 0] =row_point[x][y + 2];//b;
((unsigned char*)img->m_buffer)[pos + 1] =row_point[x][y + 1];//g
((unsigned char*)img->m_buffer)[pos + 2] =row_point[x][y + 0];//r
if(color_type == 6)//不带透明通道就填充 0xff表示不透明
((unsigned char*)img->m_buffer)[pos + 3] =row_point[x][y + 3];//a
((unsigned char*)img->m_buffer)[pos + 3] = 0xff; pos += 4;
png_destroy_read_struct(&png_ptr, &info_ptr,png_infopp_NULL);
canvas->Get_Image()->Save_To_PNG(L"bin/layer_image.png");
void Image::Save_To_PNG(constString&path)
char cpath[MAX_PATH] = {NULL };
path.Get_Multi_Byte_Str(cpath,MAX_PATH);
assert(0 && L"Save_To_PNG 创建文件失败!");
//初始化pnglib(注意相关的函数名read都变成了write)
static png_structppng_ptr =NULL;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
assert(0 && L"Save_To_PNG 创建文件时初始化pnglib失败!");
info_ptr = png_create_info_struct(png_ptr);
assert(0 && L"Save_To_PNG:png_create_info_struct失败!");
if (setjmp(png_jmpbuf(png_ptr)))
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
assert(0 && L"Save_To_PNG:pnglib出现错误!");
unsigned row_byte =m_size.w *pixel_byte;
png_set_IHDR(png_ptr, info_ptr, m_size.w,m_size.h,bit_depth,
PNG_COLOR_TYPE_RGB_ALPHA,PNG_INTERLACE_NONE,//交错无
PNG_COMPRESSION_TYPE_BASE,PNG_FILTER_TYPE_BASE);
png_write_info(png_ptr, info_ptr);
png_bytepp row_pointers = (png_bytep*)malloc(m_size.h*sizeof(png_bytep));
for (unsignedx = 0;x < m_size.h; ++x)
row_pointers[x] = (png_bytep)malloc(row_byte);
for (unsignedy = 0;y < row_byte; y += pixel_byte)
row_pointers[x][y + 2] = ((unsignedchar*)m_buffer)[x *row_byte + y + 0];
row_pointers[x][y + 1] = ((unsignedchar*)m_buffer)[x *row_byte + y + 1];
row_pointers[x][y + 0] = ((unsignedchar*)m_buffer)[x *row_byte + y + 2];
row_pointers[x][y + 3] = ((unsignedchar*)m_buffer)[x *row_byte + y + 3];
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
for (unsignedx = 0;x < m_size.h; ++x)
4.使用pnglib读写png图片相关推荐
- C语言读写BMP图片(附Github下载链接和视频讲解地址)
BMP全称(BITMAP)是微软WINDOWS系统默认使用的一种通用图片数据存储格式,特点是结构清晰,解析简单和多平台支持广泛.其文件结构由文件头结构体,文件信息头结构体,调色板(可选),以及图片数据 ...
- 负载与读写分离图片服务器集群模型
对于绝大多数网站,图片资源是一个非常重要的元素.社区论坛里面图片相册,电子商务线上产品展示图,移动端应用图片分享功能等.都在说互联网正在处于读图时代,各大中小型网站都需要保持良好的图片处理能力.需要支 ...
- Python如何打开文件、进行读写以及图片读写操作
一.文件操作 作用: 将数据持久化 将数据从瞬时状态转换为持久状态 (一)打开文件 open(参数1,参数2,参数3-) 打开文件,打开的是一个文件对象 参数1:路径和文件名 参数2:文件打开的方式 ...
- 批量读写变换图片(转)
python数字图像处理(6):图像的批量处理 有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理.这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理. 图片集合函数为 ...
- mac 上 Python 读写剪贴板图片、文字
文章目录 一.使用 ImageGrab 二.使用 NSPasteboard 三.使用 pyperclip.clipboard 一.使用 ImageGrab 只能读,只能是图片. 只能获取截图后的.或是 ...
- 安装CTeX后Texworks不能读写.eps图片?
因为CTeX是直接生成PDF的,在Texworks添加 \usepackage{epstopdf}
- Android开发笔记(三十三)文本文件和图片文件的读写
文本文件读写 简单文件读写一般是借助于FileOutputStream和FileInputStream,其中FileOutputStream用于写文件,而FileInputStream用于读文件. 写 ...
- pytorch 多进程读写同一个文件
torch 读写同一个图片 # -*- coding:utf-8 -*- from threading import Threadimport bind_cv as demo import timei ...
- JPEG图片扩展信息读取与改动
近日项目中须要用到往jpg图片中写入信息(非水印),经调研发现Android中已经封装了读写jpg图片扩展信息的api(ExifInterface). 相应api地址:http://developer ...
最新文章
- CentOs下卸载程序
- 036_PageHeader页头
- U-BOOT介绍以及disk模块源码分析
- mysql数据库学习(一)--基础
- [C语言] va_start和va_end详解
- 若依如何修改数据监控登录账户密码?
- 结构体的空间分配和位定义
- 网络攻防|一次实战中的向日葵 RCE Bypass 360
- 2022Java后端之美团笔试题
- 计算机打开后任务栏有但桌面不显示不出来,任务栏不显示打开的窗口,教您打开的窗口在任务栏上显示不出来...
- 程序之外:由电影《少年的你》揭露的bug
- linux-centos7解决视频无法看问题(安装Adobe flash player)
- Android版疯狂填字第三关,iOS/安卓版《疯狂填字》答案攻略第三十八关
- 杂谈——如何合并两个有序链表(时间复杂度为O(n))
- 复旦大学《数学分析》教学大纲,读后有感
- 关于COM类工厂80070005和8000401a错误分析及解决办法(DCOM)
- 2022/1/22 北京 mysql 多表关联查询,等值连接、非等值连接,外连接,内连接、自连接
- share memory的bank conflict分析
- 4 灰色系统 - 关联度分析法 例子 源代码
- 视频教程-【吴刚】个人网站设计初级入门标准视频教程-UI