Traitement d'image - C++ freeimage utilise l'échantillon en ligne pour inverser l'image et un résultat très étrange apparaît.
给我你的怀抱
给我你的怀抱 2017-05-16 13:21:19
0
1
883

J'ai récemment utilisé la bibliothèque de traitement d'image C++ freeimage. J'ai déjà rencontré un problème. Voir ici La cause de ce problème devrait être ce que j'ai demandé dans cette question, mais je n'ai pas trouvé de réponse à cette question.

Description du problème :

J'ai trouvé un exemple ici, donc je l'ai utilisé Certaines images peuvent être inversées normalement, mais certaines images (certaines jpg) ont des phénomènes étranges après avoir été inversées :

Le code du programme est simple et facile à comprendre, mais les résultats du traitement sont incroyables

Photo originale :

Résultat après traitement de la candidature :

Autre photo originale :

Le résultat après application du traitement d'image :

Bien sûr, il y a quelques bonnes photos, donc je ne posterai pas ici celles qui se sont bien passées.

Cela me dérange beaucoup. J'apprends encore mes connaissances personnelles en matière d'images. Si vous avez utilisé des bibliothèques similaires ou pouvez résoudre le problème, veuillez fournir des réponses. Si vous pouvez vraiment résoudre le problème, vous pouvez également m'envoyer un message privé et moi. vous enverra une enveloppe rouge de 10 yuans ou quelque chose comme ça.

Merci d'avance.
Code ci-joint :

#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;
}
给我你的怀抱
给我你的怀抱

répondre à tous(1)
phpcn_u1582
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);
}

le pas correspond au nombre d'octets qu'il y a dans chaque ligne. Afin d'accélérer la lecture, il est généralement nécessaire de s'assurer que l'adresse mémoire est un multiple de 4, ce qui est généralement supérieur à l'image elle-même.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal