图像处理 - C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果

【字号: 日期:2023-03-21浏览:22作者:雯心

问题描述

我最近在用c++的图像处理库freeimage,之前遇到一个问题见这里,那个问题的原因应该是我这个问题中提出的,但是这个问题我也没有找到答案。

问题描述:

我从这里发现一个例子,于是我使用了一下,有些图可以正常倒转的,但是有些图片(有些jpg)倒转后出现奇怪的现象:

程序代码简单很好理解,但是处理结果很匪夷所思

原图:图像处理 - C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果

应用程序处理之后的结果:图像处理 - C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果

另外一个原图:图像处理 - C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果

应用图片处理之后的结果:图像处理 - C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果

当然,也有一些图片是好的,这里就不贴那些顺利的了。

挺困扰我的,个人图像知识正在学习中,如果有用过类似库或能解决问题的欢迎提供答案,如果真的能解决问题也可以私信我之后我给发10元红包之类的。

先谢过。附代码:

#include <iostream>#include <vector>#include <stdlib.h>#include 'FreeImage.h'using namespace std;int main(){ // 初始化 FreeImage_Initialise(TRUE);// 文件名 const char* imageFile = '/Users/hh/Desktop/Possion/pool-target.jpg'; const char* saveFile = '/Users/hh/Desktop/Possion/pool-target2.jpg';// 图片格式 FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;// 获取图片格式 /* 此处需要特别注意,即使后缀名是.png并不代表图片格式就真是PNG格式,这里先通过FreeImage_GetFileType函数获取图片格式, 然后再进行加载,否则,也许会出现加载失败的情况。 */ fif = FreeImage_GetFileType(imageFile); if (fif == FIF_UNKNOWN)fif = FreeImage_GetFIFFromFilename(imageFile);FIBITMAP *bitmap1 = NULL; FIBITMAP *bitmap2 = NULL; if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)){bitmap1 = FreeImage_Load(fif, imageFile, PNG_DEFAULT); } if (!bitmap1){fprintf(stderr, 'Fail to Load Image!n');exit(-1); } else{FreeImage_Save(fif, bitmap1, saveFile, PNG_DEFAULT);bitmap2 = FreeImage_Load(fif, saveFile, PNG_DEFAULT);if (!bitmap2){ fprintf(stderr, 'Fail to Load saved Image!n'); exit(-1);} }// 获取影像的宽高,都以像素为单位 int width = FreeImage_GetWidth(bitmap1); int height = FreeImage_GetHeight(bitmap1);// 获取总共的像素数目 int pixel_num = width*height;// 获取保存每个像素的字节数 这里为3,分别为RGB unsigned int byte_per_pixel = FreeImage_GetLine(bitmap1) / width;printf('Width:%dt Height:%dt 像素总数:%dt 每像素字节数:%dn', width, height, pixel_num, byte_per_pixel);// 获取保存图片的字节数组 unsigned char *bits1 = FreeImage_GetBits(bitmap1); unsigned char *bits2 = FreeImage_GetBits(bitmap2);// 获取每个像素对应的RGB unsigned char *reds = new unsigned char[pixel_num]; unsigned char *greens = new unsigned char[pixel_num]; unsigned char *blues = new unsigned char[pixel_num];int cur = 0; for (int x = 0; x < pixel_num; ++x){// 这里对应于上述的每个像素的字节数:3reds[x] = bits1[cur++];greens[x] = bits1[cur++];blues[x] = bits1[cur++]; }// 反序更新saveFile的字节数组 cur = 0; for (int x = pixel_num - 1; x >= 0; --x){bits2[cur++] = reds[x];bits2[cur++] = greens[x];bits2[cur++] = blues[x]; }// 保存更新后的图片 FreeImage_Save(fif, bitmap2, saveFile, PNG_DEFAULT);// 从内存中删除载入图片,防止内存泄漏 FreeImage_Unload(bitmap1); FreeImage_Unload(bitmap2); // 撤销初始化 FreeImage_DeInitialise();return 0;}

问题解答

回答1:

int pitch = FreeImage_GetPitch(bitmap1);// 获取保存图片的字节数组unsigned char *bits1 = FreeImage_GetBits(bitmap1);unsigned char *bits2 = FreeImage_GetBits(bitmap2);// 上下倒转for (int y = 0; y < height; y++) { memcpy(bits2 + (y * pitch),bits1 + ((height - y - 1) * pitch),pitch);}

pitch 是每行有多少字节,是为了加快读取速度,一般是要保证内存地址是4的倍数,通常会比图片本身多。

相关文章: