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

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

问题描述:

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

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

原图:
图片描述

应用程序处理之后的结果:
图片描述

另外一个原图:
图片描述

应用图片处理之后的结果:
图片描述

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

挺困扰我的,个人图像知识正在学习中,如果有用过类似库或能解决问题的欢迎提供答案,如果真的能解决问题也可以私信我之后我给发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:%d\t Height:%d\t 像素总数:%d\t 每像素字节数:%d\n", 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){

// 这里对应于上述的每个像素的字节数:3

reds[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;

}

回答:

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的倍数,通常会比图片本身多。

以上是 C++ freeimage 使用网上的样例,将图片倒转,出现很奇怪的结果 的全部内容, 来源链接: utcz.com/p/191719.html

回到顶部