我试着只读取JPEG图像中的每一个像素。当我读取扫描线时,图像似乎被压缩到原始图像大小的八分之一。扫描线的宽度正确,但扫描线的剩余7/8未填充(0,0,0)。
我不能简单地使用每个像素8次,因为大量的信息丢失了。
我不使用任何解压缩参数,我对默认值非常满意。我使用的Libjpeg版本是https://conan.io包中心的“libjpeg/9d”。
我怎样才能得到正确的扫描线纵横比?
FILE* file_p = openfile(fileaddress);
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr err; //the error handler
cinfo.err = jpeg_std_error( &err );
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, file_p);
int result = jpeg_read_header(&cinfo, TRUE);
bool startedfine = jpeg_start_decompress(&cinfo);
int row_stride = cinfo.output_width * cinfo.output_components;
image output = create_image(cinfo.output_width, cinfo.output_height);
JSAMPARRAY buffer = calloc(1, sizeof(JSAMPROW*));
buffer[0] = calloc(1, sizeof(JSAMPROW) * row_stride);
while (cinfo.output_scanline < cinfo.output_height) {
int current_y = cinfo.output_scanline;
jpeg_read_scanlines(&cinfo, buffer, 1);
JSAMPROW row = buffer[0];
for(int row_i = 0; row_i < row_stride; row_i += 3) {
int r = (int)row[row_i];
int g = (int)row[row_i + 1];
int b = (int)row[row_i + 2];
int actual_x = row_i / 3;
output.pixels_array_2d[actual_x][current_y].r = r;
output.pixels_array_2d[actual_x][current_y].g = b;
output.pixels_array_2d[actual_x][current_y].b = g;
}
}
free(buffer[0]);
free(buffer);
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(file_p);
顺便说一句,你可能会注意到我在复制像素时将蓝色值指定给绿色值。这是因为没有它,我的测试图像颜色是错误的,我不知道为什么。
1条答案
按热度按时间eh57zj3b1#
问题是我需要调用
tjDecompress2
函数并给予正确的音高值作为参数。这里有一个关于这个参数的库文档的链接。