cari

Rumah  >  Soal Jawab  >  teks badan

Pemprosesan imej - C++ freeimage menggunakan sampel dalam talian untuk menyongsangkan imej, dan hasil yang sangat pelik muncul.

Saya baru-baru ini menggunakan pustaka pemprosesan imej C++, saya menghadapi masalah sebelum ini.

Penerangan masalah:

Saya menjumpai contoh di sini, jadi saya menggunakannya Beberapa gambar boleh diterbalikkan seperti biasa, tetapi beberapa gambar (sesetengah jpg) mempunyai fenomena aneh selepas diterbalikkan:

Kod program adalah ringkas dan mudah difahami, tetapi hasil pemprosesan adalah luar biasa

Gambar asal:

Hasil selepas pemprosesan permohonan:

Satu lagi gambar asal:

Hasil selepas menggunakan pemprosesan imej:

Sudah tentu, terdapat beberapa gambar yang bagus, jadi saya tidak akan menyiarkan gambar yang berjaya di sini.

Sangat mengganggu saya Saya masih mempelajari pengetahuan imej peribadi saya Jika anda telah menggunakan perpustakaan yang sama atau boleh menyelesaikan masalah, sila berikan jawapan Jika anda benar-benar boleh menyelesaikan masalah, anda juga boleh menghantar mesej peribadi kepada saya akan menghantar kepada anda sampul merah 10 yuan atau sesuatu.

Terima kasih terlebih dahulu.
Kod yang dilampirkan:

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

membalas semua(1)saya akan balas

  • 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 ialah berapa banyak bait yang terdapat dalam setiap baris Untuk mempercepatkan pembacaan, secara amnya perlu memastikan bahawa alamat memori adalah gandaan 4, yang biasanya lebih daripada gambar itu sendiri.

    balas
    0
  • Batalbalas