libpng处理png图片(二)
一,实现效果:图片剪切, 图片拼接

-------切割后----->

切割后的小图片
拼图的效果与此类似.
二,实现思想
利用上一篇所展示的libpng读写图片的函数,读出图片的数据域,然后对数据域进行"剪切"或者拼接获得新图片的数据域,最后通过libpng的库函数写入图片即可.
三,剪切图片的核心代码(代码内含注释)
思路:读出一张大图片的数据域buff, 按照数据与图片中像素对应的原则, 依次获取切割后每个小图片的数据域png_buff(像素矩阵)
难点:由于代码中图片数据域的表示方法为一维数组,导致获取指定行和列的某个像素时需要对一维数组做处理当做二维的来使用
代码:
void PngOper::run()
{
cout << "你好" << endl;
char * filePath = "C:\\Users\\Administrator\\Desktop\\切图 - 副本\\map_1001.png";
int width = ;
int height = ; readPngInfo(filePath, &width, &height);
cout << "读取信息:" << width << "*" << height << endl; //小块儿图片的宽,高
int cfg_width = ;
int cfg_height = ; //计算分割的小图片的行,列数目
int gW = width / cfg_width;
int exceedWidth = width % cfg_width;
int gH = height / cfg_height;
int exceedHeight = height % cfg_height; int h = exceedHeight > ? (gH + ) : gH;
int w = exceedWidth > ? (gW + ) : gW; //读取大图片数据域
RGBA_data *buff = (RGBA_data *)malloc(width*height*sizeof(RGBA_data));
load_png_image(filePath, &width, &height, buff); //分配小块儿地图的数据域
RGBA_data *png_buff = (RGBA_data *)malloc(cfg_width * cfg_height * sizeof(RGBA_data));
for (int i = ; i < h; i++)
{
for (int j = ; j < w; j++)
{
//1.获取png_buff数据域
buffCopy(buff, width, height, png_buff, cfg_width, cfg_height, j*cfg_width, i*cfg_height);
//2.写图片
int idx = i*w + j + ;
string fileName = "C:\\Users\\Administrator\\Desktop\\切图 - 副本\\" + to_string(idx) + ".png";
write_RGBA_Image(fileName.c_str(), cfg_width, cfg_height, "test", png_buff);
}
} if (buff != nullptr)
{
free(buff);
buff = nullptr;
}
if (png_buff != nullptr)
{
free(png_buff);
png_buff = nullptr;
}
}
四,注意
png图片的color_type有多种,包括熟知的RGB类型与RGBA类型,通过读取图片信息可以获取该内容.
进行图片读写时要兼顾多种类型的color_type
libpng处理png图片(二)的更多相关文章
- android 图片二维码识别和保存(二)
续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的 ...
- 如何通过github上传项目并在readme.md中展示图片二维码
将本地项目上传至github 第一步:git init (创建仓库) 第二步:git add README.md (添加项目)git add * 第三步:git commit -m &qu ...
- python图片二值化提高识别率
import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport ...
- C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)
C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...
- online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码,
online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码, 1 http://cli.i ...
- com.google.zxing.NotFoundException-识别图片二维码信息错误
一.问题由来 自己在做一个小程序项目的后台,其中需要使用到识别图片二维码信息,而且是必须在Java后台进行识别二维码操作.去百度里面很快找到一个方法, 可以识别简单的二维码,而且自己生成的简单的二维码 ...
- libpng处理png图片(一)
一:libpng库的编译 环境:windows10 + VS2013 需要下载:libpng, zlib两个库 下载地址: libpng:http://libmng.com/pub/png/libpn ...
- [置顶] c#验证码识别、图片二值化、分割、分类、识别
c# 验证码的识别主要分为预处理.分割.识别三个步骤 首先我从网站上下载验证码 处理结果如下: 1.图片预处理,即二值化图片 *就是将图像上的像素点的灰度值设置为0或255. 原理如下: 代码如下: ...
- 验证码图片二值化问题 BitmapData 怎么解决
对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...
随机推荐
- Facebook 宣布开源Python重写后的OnlineSchemaChange
本文会简要介绍,OnlineSchemaChange在经历从PHP到Python重写后的改进和变化 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地 ...
- 你跟上技术趋势了么? 来看看这10场2017热门it技术会议!
2016年各类大会让人应接不暇,技术圈儿最不缺的就是各种大会小会,有的纯干货,有的纯广告.作为一名技术开发者,参加了几场大会,你是不是也开始思忖:究竟哪些会议才值得参加?下面活动家为你推荐几场2017 ...
- Java中实现String.padLeft和String.padRight
因为习惯了C#中的padLeft和padRight,接触Java后突然失去这两个功能,觉得别扭,就试着实现了这两个方法. Java中String.format()中带有字符串对齐功能如下: Syste ...
- MySQL自增长的bug?
实验环境: mysql> status--------------mysql Ver 14.14 Distrib 5.7.14, for Linux (x86_64) using EditLin ...
- hdu4764 Stone 博弈
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4764 很水的博弈题目 代码: #pragma comment(linker, "/STAC ...
- z-Tree-checkbox
引入z-Tree css/js/不要忘记excheck.js //html部分 <div> <input type="text" v-model="b ...
- mysql安装出现的问题
ERROR 1045 (28000): Access denied for user root@localhost (using password: NO) 错误描述: Mysql中添加用户之后可能出 ...
- mac上解决Resource temporarily unavailable
Resource temporarily unavailable这种问题一般是因为当前的进程数或者文件数不够 fork: Resource temporarily unavailable 修改最大进程 ...
- pod install 出现 Unable to find a specification for `xxxxx` 解决方案
pod repo update 更新一下repo,更新完成之后即可解决无法找到xxx第三方框架的问题了
- CentOS7 防火墙规则 (firewalld)
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disab ...