Прочитайте в формате JPEG, измените его размер и сохраните на диск

Изменение размера существующего JPEG в новый, меньший.

Пример: before_3000x2000.jpeg →нородностей after_1024x768.jpeg

Я думаю, что мне понадобятся псевдо-функции, подобные этим:

foo (before_file_path, after_file_path, new_width, new_height)

который использует

degpress_jpeg (before_file_path)

изменить размер (decompressed_data, new_width, new_height)

compress_jpeg (resized_data)

save_jpeg (сжатые_данные, after_file_path)

Пожалуйста, исправьте мой подход, если я что-то неправильно понял.

  • Поскольку разрешения будут различаться, сначала вам нужно распаковать существующий jpeg, чтобы вы могли правильно работать с данными пикселей.
  • Во-вторых, вы изменяете размер пиксельных данных в меньший буфер с помощью некоторой функции foo ().
  • В-третьих, вы сжимаете указанный буфер и сохраняете его на диск.

Для начала я попытался поиграть с

write_JPEG_file (char * имя файла, int качество)

функция предусмотрена в example.c из jpeglib-9b. Я просто хочу написать тестовое изображение в любом разрешении, которое я укажу, одним цветом. Но я сталкиваюсь с проблемой. я считать Я пишу случайную память, и я не знаю почему. (вот картинка: img_100x100) Обратите внимание, как наверху есть белый цвет до определенной точки. Эта часть изменяется в соответствии с тем, что я назначаю в первом цикле. Но после определенного количества это изменяется на случайный шум. Зачем?

Я определил image_width, image_height, image_buffer
Я заменил все fopen(...) с fopen_s(...),
Я жестко закодировал качество до 100 в jpeg_set_quality(...)

#include <iostream>
#include "jpeg-9b\jpeglib.h"#include "jpeg-9b\jerror.h"
int TEST_WRITE_JPEG(char* file_name)
{
// DEFINE A PIC HERE
const int image_width = 100;        /* Number of columns in image */
const int image_height = 100;   /* Number of rows in image */
JSAMPLE* image_buffer = new JSAMPLE[image_width * image_height]();  /* Points to large array of R,G,B-order data */
for (int i = 0; i < image_width*image_height; i++)
{
image_buffer[i] = 255;
}

/* Step 1: allocate and initialize JPEG compression object */
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * outfile;
JSAMPROW row_pointer[1];
int row_stride;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);

/* Step 2: specify data destination (eg, a file) */
if (fopen_s(&outfile, file_name, "wb") != NULL)
{
fprintf(stderr, "can't open %s\n", file_name);
exit(1);
}
jpeg_stdio_dest(&cinfo, outfile);

/* Step 3: set parameters for compression */
cinfo.image_width = image_width;    /* image width and height, in pixels */
cinfo.image_height = image_height;
cinfo.input_components = 3;         /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB;     /* colorspace of input image */

jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 100, TRUE);

/* Step 4: Start compressor */
jpeg_start_compress(&cinfo, TRUE);

/* Step 5: while (scan lines remain to be written) */
row_stride = image_width * 3;

while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = (JSAMPROW)&image_buffer[cinfo.next_scanline * row_stride];
(void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
}

/* Step 6: Finish compression */
jpeg_finish_compress(&cinfo);
/* After finish_compress, we can close the output file. */
fclose(outfile);

/* Step 7: release JPEG compression object */
/* This is an important step since it will release a good deal of memory. */
jpeg_destroy_compress(&cinfo);

return 0;
}

Почему я пишу этот а изображение не белое?
Почему происходит сбой программы, если image_buffer содержит более 128×128 неподписанных символов?

1

Решение

3 байта используются для каждого пикселя, поэтому вы должны выделить 3 * image_width * image_height элементы в то время как вы выделяете только image_width * image_height элементы. Выделите и инициализируйте достаточное количество элементов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]