首先,我从未使用过C上的图像,因此我正在寻找一种方法,可以更改JPEG或PNG图像的RGB值以获得红色,蓝色和绿色的结果图像,就像滤色镜一样,可以通过将R值更改为0,将G值更改为0,将B值更改为255来完成,反之亦然,但是我需要在C语言中执行此操作,因为我使用的是jpeglib.h和参考代码'以前从未使用过此API,我可以加载图像并将其写为输出图像,但是在任何地方都找不到改变RGB值的方法,我该怎么办?
我正在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;
}
答案 0 :(得分:0)
我认为更好的方法是通过解压缩图像更改颜色,您想要更改并再次保存,我做了第一部分,但我不知道如何再次将数据放入新图像中,在你的情况下,在下一步中,你需要转换为 ppm。这是保存格式正确的图像的路径,但我不知道如何将图像放入这种格式。 https://www.huinfinito.com.br/motores/1438-valvula-solenoide-para-agua-12v-180-x-.html,如果您发现了如何做到这一点,请回复此帖子。要更改 rgb 值,您可以直接从其地址更改,因为它是整数的合取。
if(i2==3||(sair==1&&i2==2)){
contCorSelecionada++;
int i;
for(i=0;i<3;i++){
*datamenos3=corTroca.limiteinferior[i];
datamenos3++;`}
我这样做了,但陷入了我之前提到的问题。