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 怎么解决
对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...
随机推荐
- 今天打补丁出问题了,害得我组长被扣了1k奖金。
今天是第三次给mxdw打补丁和打包,外加公司高管说有一个东西必须要今天之内搞定外放. 我当时问策划为什么这么着急?策划说大佬决定的(这种做事方式真的很不习惯).我等屁民加班加点的搞事情,把功能搞出去了 ...
- java自带的http get/post请求servlet
http请求方式太多,有java自带的,也有httpClient,用的地方还挺多,所以在此做一个小小的总结: public class HttpRequest { /** * 向指定URL发送GET方 ...
- VueJs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由选项以及使用
一.IDE的选择: VsCode和WebStorm都是不错的选择,两者运行调试都非常的方便都可以使用快捷键运行和停止,就打开项目的速度和对电脑配置的要求来说,vscode要比webstorm要出色很多 ...
- [刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...
- redis安装学习
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类型.内置复制.Lu ...
- MySql5.7环境搭建
1. 安装mysql的linux系统 [root@grewan ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@grewan ...
- 1.各个浏览器内核?经常遇到的浏览器兼容性有哪些?解决办法?常用的hack技巧?
IE: trident内核 Firefox(火狐):gecko内核 Safari(苹果):webkit内核 Opera(欧鹏):以前是presto内核,现在是Blink内核 Chrome:Blink ...
- 龟兔赛跑,杭电oj-2059
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2059 [Problem Description] 据说在很久很久以前,可怜的兔子经历了人生中最大的打击 ...
- 13、Java菜单条、菜单、菜单项
13.Java菜单条.菜单.菜单项 一般用Java做界面时,都得牵涉到菜单条.菜单.菜单项的设计.菜单项放在菜单里,菜单放在菜单条里,且其字体均可设置. 13.1.菜单条(Menubar) Frame ...
- Lua学习(4)——函数
在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y).唯一的差别是,如果函数只有一个参数,并且该参数的类型为字符串常量 ...