搜尋

首頁  >  問答  >  主體

影像處理 - 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;
}
给我你的怀抱给我你的怀抱2751 天前882

全部回覆(1)我來回復

  • phpcn_u1582

    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的倍數,通常會比圖片本身多。

    回覆
    0
  • 取消回覆