一,实现效果:图片剪切, 图片拼接

        

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

         

                               切割后的小图片

  拼图的效果与此类似.

二,实现思想

  利用上一篇所展示的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图片(二)的更多相关文章

  1. android 图片二维码识别和保存(二)

    续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的 ...

  2. 如何通过github上传项目并在readme.md中展示图片二维码

    将本地项目上传至github   第一步:git init (创建仓库)   第二步:git add README.md (添加项目)git add *   第三步:git commit -m &qu ...

  3. python图片二值化提高识别率

    import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport ...

  4. C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)

    C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...

  5. online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码,

    online QRcode generator ,  QRcode=== (Quick Response Code)    , 二维条码,二维码,彩色二维码,图片二维码, 1 http://cli.i ...

  6. com.google.zxing.NotFoundException-识别图片二维码信息错误

    一.问题由来 自己在做一个小程序项目的后台,其中需要使用到识别图片二维码信息,而且是必须在Java后台进行识别二维码操作.去百度里面很快找到一个方法, 可以识别简单的二维码,而且自己生成的简单的二维码 ...

  7. libpng处理png图片(一)

    一:libpng库的编译 环境:windows10 + VS2013 需要下载:libpng, zlib两个库 下载地址: libpng:http://libmng.com/pub/png/libpn ...

  8. [置顶] c#验证码识别、图片二值化、分割、分类、识别

    c# 验证码的识别主要分为预处理.分割.识别三个步骤 首先我从网站上下载验证码 处理结果如下: 1.图片预处理,即二值化图片 *就是将图像上的像素点的灰度值设置为0或255. 原理如下: 代码如下: ...

  9. 验证码图片二值化问题 BitmapData 怎么解决

    对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...

随机推荐

  1. TypeScript基本知识(为学习AngularJS2框架做个小铺垫)

    学习angularjs2框架,需要了解一些TypeScript知识点,基本了解下面这几个知识点学习AngularJS2 就够用了 1.TypeScript 1.1显示类型的定义 TypeScript类 ...

  2. 获取安卓的SH1安全码

     用于获取手机联系人 信息   public static String sHA1(Context context) { try { PackageInfo info = context.getPac ...

  3. [js笔记整理]事件篇

    一.事件流1.冒泡事件:从特定的事件到不特定事件依次触发:(由DOM层次的底层依次向上冒泡)(1)示例: <html onclick="add('html<br>')&qu ...

  4. LINQ基础(二)

    本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblo ...

  5. php学习之重要内置函数

    1. require_once()函数 此函数在脚本执行期间包含并执行指定的文件,与require语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含. require_once()函数 ...

  6. [刷题]算法竞赛入门经典(第2版) 6-4/UVa439 6-5/UVa1600

    比较忙比较累,只贴代码了. 题目:6-4 UVa439 - Knight Moves //UVa439 - Knight Moves //Accepted 0.000s //#define _XIEN ...

  7. (转载)sizeof

    [C++专题]C++ sizeof 使用规则及陷阱分析   摘要:鉴于sizeof为各大软件公司笔试.面试必考题,现收集sizeof的各种用法,尽量做到全面理解,其中例子希望能举一反三.提示:下文例子 ...

  8. Java UDP Socket

    本文转载地址:          Java学习路上的收获:http://blog.csdn.net/qinpeng100423/article/details/8980423 一. UDP协议定义 U ...

  9. Hibernate中遇到的一个Exception

    做项目的时候遇到一个很头疼的报错:Illegal attempt to associate a collection with two opensessions 出错原因:  一个Object Ver ...

  10. hello Kotlin!

    听说谷爹要把Kotlin作为了Android开发的一级语言,吓得我赶紧写个“Hello Kotlin!”压压惊! Kotlin是由JetBrains 公司开发的语言,并且已经开源.而JetBrains ...