libpng处理png图片(二)

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

        

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

         

                               切割后的小图片

  拼图的效果与此类似.

二,实现思想

  利用上一篇所展示的libpng读写图片的函数,读出图片的数据域,然后对数据域进行"剪切"或者拼接获得新图片的数据域,最后通过libpng的库函数写入图片即可.

三,剪切图片的核心代码(代码内含注释)

  思路:读出一张大图片的数据域buff, 按照数据与图片中像素对应的原则, 依次获取切割后每个小图片的数据域png_buff(像素矩阵)

  难点:由于代码中图片数据域的表示方法为一维数组,导致获取指定行和列的某个像素时需要对一维数组做处理当做二维的来使用

  代码:

 1 void PngOper::run()
 2 {
 3     cout << "你好" << endl;
 4     char * filePath = "C:\\Users\\Administrator\\Desktop\\切图 - 副本\\map_1001.png";
 5     int width = 0;
 6     int height = 0;
 7
 8     readPngInfo(filePath, &width, &height);
 9     cout << "读取信息:" << width << "*" << height << endl;
10
11
12     //小块儿图片的宽,高
13     int cfg_width = 192;
14     int cfg_height = 180;
15
16     //计算分割的小图片的行,列数目
17     int gW = width / cfg_width;
18     int exceedWidth = width % cfg_width;
19     int gH = height / cfg_height;
20     int exceedHeight = height % cfg_height;
21
22     int h = exceedHeight > 0 ? (gH + 1) : gH;
23     int w = exceedWidth > 0 ? (gW + 1) : gW;
24
25     //读取大图片数据域
26     RGBA_data *buff = (RGBA_data *)malloc(width*height*sizeof(RGBA_data));
27     load_png_image(filePath, &width, &height, buff);
28
29     //分配小块儿地图的数据域
30     RGBA_data *png_buff = (RGBA_data *)malloc(cfg_width * cfg_height * sizeof(RGBA_data));
31     for (int i = 0; i < h; i++)
32     {
33         for (int j = 0; j < w; j++)
34         {
35             //1.获取png_buff数据域
36             buffCopy(buff, width, height, png_buff, cfg_width, cfg_height, j*cfg_width, i*cfg_height);
37             //2.写图片
38             int idx = i*w + j + 1;
39             string fileName = "C:\\Users\\Administrator\\Desktop\\切图 - 副本\\" + to_string(idx) + ".png";
40             write_RGBA_Image(fileName.c_str(), cfg_width, cfg_height, "test", png_buff);
41         }
42     }
43
44     if (buff != nullptr)
45     {
46         free(buff);
47         buff = nullptr;
48     }
49     if (png_buff != nullptr)
50     {
51         free(png_buff);
52         png_buff = nullptr;
53     }
54 }

四,注意

  png图片的color_type有多种,包括熟知的RGB类型与RGBA类型,通过读取图片信息可以获取该内容.

  进行图片读写时要兼顾多种类型的color_type

时间: 2024-10-07 06:29:03

libpng处理png图片(二)的相关文章

Ubuntu 14.04 下使用 OpenCV 图片二值化处理

参考: OpenCV - Ubuntu 14.04 64 bit 图片二值化工具 Ubuntu 14.04 下使用 OpenCV 图片二值化处理 TBD. 原文地址:https://www.cnblogs.com/qq952693358/p/8996719.html

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

续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的释放,导致内存中的图片不断累积,内存占用不断攀升.因此,需要对图片进行释放,释放的时候需要特别关注的地方有: 1.释放注意图片的状态. 2.注意异常的捕获. 下面就是图片释放的有关代码. /** * 回收bitmap */ public static void recycleBitmap(Bitma

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

C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> /// <param name="original"> 源图像. </param> /// <returns> 8位灰度图像. </returns> public static Bitmap RgbToGrayScale(Bitmap orig

python图片二值化提高识别率

import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport reimport string def createFile(filePath,newFilePath): img = Image.open(filePath) # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度. Img = img.conver

c#实现图片二值化例子(黑白效果)

C#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 7

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

对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色的小点点呢?原来都是没有的-- 谁能帮我看看代码怎么改!谢谢大牛们帮忙!! Bitmap bit1 = new Bitmap(bit); Rectangle rect1 = new Rectangle(0, 0, bit1.Width, bit1.Height); BitmapData bitd =

OpenGL使用libPng读取png图片

#include<stdarg.h> #include<png.h> #include<glut.h> #include<math.h> #include<iostream> #pragma comment(lib,"libpng16.lib")//读取png图片 GLuint CreateTextureFromPng(const char* filename) { unsigned char header[8]; //8 i

Bitmap 图片二次采样 【转载】

1.bitmap概述 Android系统支持几种图片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位图#ffffffff,包括图片透明度Alpha和RGB,图片质量很好,每一个像素位占4个字节,如果图片很大将会占据很大的内存空间.存储在SDCard的image很小,加载进内存可能就会很大.因此,对bitmap图像进行操作,应该特别小心,可能出现内存溢出问题.为此对于大图片,应该引入该图片的二次采样生成缩略图.

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的文本str格式,loc表示文本在图中的位置,font_size可以使用cv2.FONT_HERSHEY_SIMPLEX, font_scale表示文本的规格,color表示文本颜色,linestick表示线条大小 信用卡数字识别: 信用卡      数字模板涉及到的内容:主要是采用模板匹配的思想 思