Heim > Fragen und Antworten > Hauptteil
Ich habe kürzlich die C++-Bildverarbeitungsbibliothek freeimage verwendet. Siehe hier. Die Ursache für dieses Problem sollte die sein, die ich in dieser Frage gestellt habe, aber ich habe keine Antwort auf diese Frage gefunden.
Problembeschreibung:
Ich habe hier ein Beispiel gefunden, also habe ich es verwendet. Einige Bilder können normal umgekehrt werden, aber einige Bilder (einige JPG) weisen nach dem Umkehren seltsame Phänomene auf:
Der Programmcode ist einfach und leicht zu verstehen, aber die Verarbeitungsergebnisse sind unglaublich
Originalbild:
Ergebnis nach Antragsbearbeitung:
Noch ein Originalbild:
Das Ergebnis nach Anwendung der Bildverarbeitung:
Natürlich gibt es einige gute Bilder, daher werde ich die, die gut gelaufen sind, hier nicht posten.
Es stört mich sehr. Wenn Sie ähnliche Bibliotheken verwendet haben oder das Problem lösen können, können Sie mir und mir auch eine private Nachricht senden Ich werde Ihnen einen roten 10-Yuan-Umschlag oder so etwas schicken.
Vielen Dank im Voraus.
Angehängter Code:
#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;
}
phpcn_u15822017-05-16 13:23:19
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的倍数,通常会比图片本身多。