我在Ubuntu Intrepid上,我正在使用jpeglib62 6b-14。我正在研究一些代碼,當我嘗試運行它時,它只會在頂部顯示出一些亂碼輸出的黑屏。經過幾個小時的調試,我把它歸結爲JPEG基礎,所以我拿出了示例代碼,在它周圍寫了一段代碼,輸出結果完全一樣。Jpeglib代碼給出亂碼輸出,甚至捆綁的示例代碼?
我確信jpeglib被用在這個系統的很多地方,它只是版本庫中的版本,所以我很猶豫地說這是jpeglib或Ubuntu包裝中的錯誤。
我把下面的例子代碼(大多數評論剝離)。 輸入的JPEG文件是一個帶有3個通道的未壓縮的640x480文件,因此它應該是921600字節(而且是)。輸出圖像是JFIF和大約9000字節。
如果你能幫助我甚至提示,我會非常感激。
謝謝!
#include <stdio.h>
#include <stdlib.h>
#include "jpeglib.h"
#include <setjmp.h>
int main()
{
// read data
FILE *input = fopen("input.jpg", "rb");
JSAMPLE *image_buffer = (JSAMPLE*) malloc(sizeof(JSAMPLE) * 640 * 480 * 3);
if(input == NULL or image_buffer == NULL)
exit(1);
fread(image_buffer, 640 * 3, 480, input);
// initialise jpeg library
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
// write to foo.jpg
FILE *outfile = fopen("foo.jpg", "wb");
if (outfile == NULL)
exit(1);
jpeg_stdio_dest(&cinfo, outfile);
// setup library
cinfo.image_width = 640;
cinfo.image_height = 480;
cinfo.input_components = 3; // 3 components (R, G, B)
cinfo.in_color_space = JCS_RGB; // RGB
jpeg_set_defaults(&cinfo); // set defaults
// start compressing
int row_stride = 640 * 3; // number of characters in a row
JSAMPROW row_pointer[1]; // pointer to the current row data
jpeg_start_compress(&cinfo, TRUE); // start compressing to jpeg
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
// clean up
fclose(outfile);
jpeg_destroy_compress(&cinfo);
}
感謝您的回答,但是: 「輸入的JPEG文件是一個包含3個通道的未壓縮的640x480文件,因此它應該是921600字節(而且是)。」 它是未壓縮的,它*的大小是921600字節! – sgielen 2009-02-04 08:55:21
什麼...?當我在原始圖像上運行壓縮,然後對結果運行jpeginfo(也是621600字節),我得到「不是JPEG文件:以0x80 0x78開頭」,然後當我運行該程序時,我得到一個有效的結果圖像!這裏發生了什麼?! :S – sgielen 2009-02-04 16:36:05
(呃,921600字節,對不起) – sgielen 2009-02-04 16:36:36