Измените значения RGB изображения JPEG или PNG с C, используя jpeglib.h - PullRequest
0 голосов
/ 01 октября 2018

Прежде всего, я никогда не работал с изображениями на C, поэтому я ищу способ, которым я могу изменить значения RGB изображения JPEG или PNG для получения красного, синего и зеленого результирующего изображения, простокак цветной фильтр сделал бы, изменив значения R на 0, G на 0 и B на 255 и наоборот, но мне нужно сделать это на C, я использую jpeglib.h и справочный код для руководства, так как яЯ никогда раньше не работал с этим API, я могу загрузить изображение и записать его в качестве выходного изображения, однако я нигде не нашел способа изменить значения RGB, как я могу это сделать?

Iя работаю в среде UNIX, и я пытаюсь научиться обрабатывать любое изображение JPEG в формате ppm по академическим причинам.

мой код следующий:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/stat.h>
#include <jpeglib.h>

int main (int argc, char *argv[]) {
  int rc, i, j;
  char *syslog_prefix = (char*) malloc(1024);
  sprintf(syslog_prefix, "%s", argv[0]);
  openlog(syslog_prefix, LOG_PERROR | LOG_PID, LOG_USER);

  if (argc != 2) {
    fprintf(stderr, "usage: %s filename.jpg\n", argv[0]);
    exit(EXIT_FAILURE);
  }
  struct stat file_info;
  unsigned long jpg_size;
  unsigned char *jpg_buffer;
  struct jpeg_decompress_struct cinfo;
  struct jpeg_error_mgr jerr;
  unsigned long bmp_size;
  unsigned char *bmp_buffer;
  int row_stride, width, height, pixel_size;

  rc = stat(argv[1], &file_info);
  if (rc) {
    syslog(LOG_ERR, "FAILED to stat source jpg");
    exit(EXIT_FAILURE);
  }

  jpg_size = file_info.st_size;
  jpg_buffer = (unsigned char*) malloc(jpg_size + 100);

  int fd = open(argv[1], O_RDONLY);
  i = 0;
  while (i < jpg_size) {
    rc = read(fd, jpg_buffer + i, jpg_size - i);
    i += rc;
  }
  close(fd);

  cinfo.err = jpeg_std_error(&jerr);  
  jpeg_create_decompress(&cinfo);
  jpeg_mem_src(&cinfo, jpg_buffer, jpg_size);

  rc = jpeg_read_header(&cinfo, TRUE);

  if (rc != 1) {
    syslog(LOG_ERR, "File does not seem to be a normal JPEG");
    exit(EXIT_FAILURE);
  }

  jpeg_start_decompress(&cinfo);

  width = cinfo.output_width;
  height = cinfo.output_height;
  pixel_size = cinfo.output_components;

  bmp_size = width * height * pixel_size;
  bmp_buffer = (unsigned char*) malloc(bmp_size);

  row_stride = width * pixel_size;

  while (cinfo.output_scanline < cinfo.output_height) {
    unsigned char *buffer_array[1];
    buffer_array[0] = bmp_buffer + \
               (cinfo.output_scanline) * row_stride;

    jpeg_read_scanlines(&cinfo, buffer_array, 1);

  }

  jpeg_finish_decompress(&cinfo);

  jpeg_destroy_decompress(&cinfo);

  free(jpg_buffer);

  fd = open("output.ppm", O_CREAT | O_WRONLY, 0666);
  char buf[1024];

  rc = sprintf(buf, "P6 %d %d 255\n", width, height);
  write(fd, buf, rc);
  write(fd, bmp_buffer, bmp_size);

  close(fd);
  free(bmp_buffer);

  return EXIT_SUCCESS;
}
...