libjpeg 处理CMYK 格式数据以及iCC配置文件

  • ICC文件,又叫ICC Color Profile,是指设备管理色彩特性的文件,各种具有色彩管理功能的软件(如photoshop)可以依据ICC文件的配置对不同设备的颜色特点进行准确地显示,转换和改变。同时,也能让颜色在不同设备上的传递过程时的失真最小 。
  • ICC文件是将所有和设备有关的颜色数据(RGB和CMYK数据),一一对应到和设备无关的Lab颜色模式上。从而通过Lab模式做为传递中介,保持所有颜色外观的一致,icc文件用来描述设备的颜色特性,并用于后期的空间转换。如显示器的icc文件,记录了显示器RGB和XYZ颜色关系,打印机和印刷机的icc记录了CMYK和lab颜色关系,XYZ,lab等颜色空间是与设备无关的颜色空间,统称为PCS空间,为颜色转换提供了中间空间。可以想象,如果显示器模拟印刷机的颜色,不可能将印刷机CMYK直接转换成显示器RGB,因为CMYK是设备的输出值,RGB是显示器的输入值,那怎么产生联系?CMYK-LAB-XYZ-RGB,这样就能进行颜色的转换
  • ICC profile 的配置文件表:https://www.kamilet.cn/icc-profile/

CMYK convert RGB

  • 对于存储格式为CMYK的图像,通常应用于jpeg和tiff格式中,利用libjpeg和libtiff库解析图片数据时,需要根据解析的方式进行相应的转换

  • 解析libjpeg时

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>#include "libjpeg/jpeglib.h"
    #include "libjpeg/jerror.h"typedef struct _Mat{unsigned int nImageWidth;unsigned int nImageHeight;unsigned int nChannels;unsigned char* pImageData; // 像素数据,RGB排列
    } Mat, *pHddMat;int decodeJpgImage(const char* jpgSource, Mat* pImgMat){struct jpeg_decompress_struct cinfo;jpeg_error_manager jerr;FILE* fp;JSAMPARRAY buffer;int row_stride = 0;unsigned char* dst = NULL;int rgb_size;fp = fopen(jpgSource, "rb");if (fp == NULL){printf("open input jpg file %s failed.\n", jpgSource);return -1;}cinfo.err = jpeg_std_error(&jerr.pub);jerr.pub.error_exit = jpeg_error_exit;if (setjmp(jerr.setjmp_buffer)){jpeg_destroy_decompress(&cinfo);fclose(fp);printf("parse %s  input jpg file failed.\n", jpgSource);return -2;}jpeg_create_decompress(&cinfo);// step 2a: specify data source (eg, a handle)jpeg_stdio_src(&cinfo, fp);// step 2b: save special markers for later readingjpeg_save_markers(&cinfo, JPEG_COM, 0xFFFF);int m = 0;for (m = 0; m < 16; m++) {jpeg_save_markers(&cinfo, JPEG_APP0 + m, 0xFFFF);}// step 3: read handle parameters with jpeg_read_header()int retcode = jpeg_read_header(&cinfo, TRUE);int colorType = cinfo.num_components;switch (colorType) {case 1:cinfo.out_color_space = JCS_GRAYSCALE;cinfo.out_color_components = 1;break;case 4:cinfo.out_color_space = JCS_CMYK;cinfo.out_color_components = 4;break;default:cinfo.out_color_space = JCS_RGB;cinfo.out_color_components = 3;break;}jpeg_start_decompress(&cinfo);row_stride = cinfo.output_width * cinfo.output_components;rgb_size = row_stride * cinfo.output_height; // image data sizebuffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);pImgMat->nImageWidth = cinfo.output_width;pImgMat->nImageHeight = cinfo.output_height;pImgMat->nChannels = cinfo.num_components;pImgMat->pImageData = (unsigned char*)malloc(sizeof(unsigned char) * rgb_size); // 分配总内存dst = pImgMat->pImageData;while (cinfo.output_scanline < cinfo.output_height){JSAMPROW src = buffer[0];jpeg_read_scanlines(&cinfo, buffer, 1);   // 解压每一行// if input is CMYK for(unsigned x = 0; x < cinfo.output_width; x++) {// CMYK pixels are inverteddst[0] = ~src[0];  // Cdst[1] = ~src[1];  // Mdst[2] = ~src[2];  // Ydst[3] = ~src[3];  // Ksrc += 4;dst += 4;}//memcpy(dst, buffer[0], row_stride);//dst += row_stride;}jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);fclose(fp);return 0;
    }int encodeJpgImage(const char* jpgSavefile, Mat* jpgImg,int quality){struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;int row_stride = 0;FILE* fp = NULL;JSAMPROW row_pointer[1];cinfo.err = jpeg_std_error(&jerr);jpeg_create_compress(&cinfo);fp = fopen(jpgSavefile, "wb");if (fp == NULL){printf("open output %s  file failed.\n", jpgSavefile);return -1;}jpeg_stdio_dest(&cinfo, fp);cinfo.image_width = jpgImg->nImageWidth;cinfo.image_height = jpgImg->nImageHeight;cinfo.input_components = jpgImg->nChannels;int colorType = cinfo.input_components;switch (colorType) {case 1:cinfo.in_color_space = JCS_GRAYSCALE;break;case 4:cinfo.in_color_space = JCS_CMYK;break;default:cinfo.in_color_space = JCS_RGB;break;}jpeg_set_defaults(&cinfo);jpeg_set_quality(&cinfo, quality, TRUE);//cinfo.optimize_coding = TRUE;jpeg_start_compress(&cinfo, TRUE);row_stride = jpgImg->nImageWidth * cinfo.input_components;while (cinfo.next_scanline < cinfo.image_height){row_pointer[0] = &jpgImg->pImageData[cinfo.next_scanline * row_stride];BYTE *target_p = row_pointer[0];for(unsigned x = 0; x < cinfo.image_width; x++) {// CMYK pixels are invertedtarget_p[0] = ~target_p[0]; // Ctarget_p[1] = ~target_p[1];    // Mtarget_p[2] = ~target_p[2];    // Ytarget_p[3] = ~target_p[3];    // Ktarget_p += 4;}        jpeg_write_scanlines(&cinfo, row_pointer, 1);}jpeg_finish_compress(&cinfo);jpeg_destroy_compress(&cinfo);fclose(fp);return 0;
    }
    
    • CMYK转换RGB
       int cols = pImgMat->nImageWidth;int rows = pImgMat->nImageHeight;int channels = pImgMat->nChannels;for (int row = 0; row < rows; row++) {unsigned char* imgPtr = pImgMat->pImageData + row * cols * channels;for (int j = 0; j < cols; j++) {int c = imgPtr[j*channels+0];int m = imgPtr[j*channels+1];int y = imgPtr[j*channels+2];int k = imgPtr[j*channels+3];unsigned r = (255 - c) * (255 - k) >> 8;unsigned g = (255 - m) * (255 - k) >> 8;unsigned b = (255 - y) * (255 - k) >> 8;//if read value not ~255 ops, similar to opencv library //unsigned r = k - ((255 - c)*k >> 8);//unsigned g = k - ((255 - m)*k >> 8);//unsigned b = k - ((255 - y)*k >> 8);}}
    

RGB to CMYK conversion formula

The R,G,B values are divided by 255 to change the range from 0…255 to 0…1:

R’ = R/255

G’ = G/255

B’ = B/255

The black key (K) color is calculated from the red (R’), green (G’) and blue (B’) colors:

K = 1-max(R’, G’, B’)

The cyan color © is calculated from the red (R’) and black (K) colors:

C = (1-R’-K) / (1-K)

The magenta color (M) is calculated from the green (G’) and black (K) colors:

M = (1-G’-K) / (1-K)

The yellow color (Y) is calculated from the blue (B’) and black (K) colors:

Y = (1-B’-K) / (1-K)

  • 参考文献

    • CMYK to RGB conversion | color conversion (rapidtables.com)

CMYK convert RGB相关推荐

  1. PIL image.convert('RGB')在数据生成中真的比较好吗?

    1 致谢 感谢陈助教给我们讲述了人脸关键点检测的相关知识. 2 前言 虽然陈助教给我们讲了人脸关键点的知识,他在样本生成时用到了image.convert('RGB'),但是我在想这样做,真的好吗?

  2. mupdf中CMYK与RGB的转换算法

    之前碰到过RGB与CMYK之间转换的问题,网上也没有比较官方的转换公式,不同的软件可能会采用不同的算法,现在mupdf,正好也看到了这样的算法,还是有一定参考价值的,具体算法如下: #define M ...

  3. HTML把cmyk转换为RGB,CMYK在线转换成pantone色卡号,cmyk转换对应潘通色号

    Cyan(C) % Magenta(M) % Yellow(Y) % Key (black)K % 最接近的潘通色号是: 选择需要集中接近颜色 16 32 48 64 80 96 RGB : (255 ...

  4. 【转】“HSB”、“lab“、“CMYK“、“RGB“有什么区别?

    "HSB"."lab"."CMYK"."RGB"有什么区别_百度知道 (baidu.com)https://zhidao ...

  5. Csharp: Winform 顏色選擇器 Color convert RGB and RGB convert Color

    /// <summary>/// 選擇顏色/// </summary>/// <param name="sender"></param&g ...

  6. 【OpenCV3】RGB图像向CMYK颜色空间转换

    1.RGB颜色空间 RGB(红色,绿色,蓝色)是表示光发射的颜色空间. RGB是一个加性色谱,当所有原色组合时,形成白色. 这类似于实际的光谱,如果您结合自然光的所有颜色(例如,彩虹上的所有颜色),则 ...

  7. RGB 和 CMYK 相互转换

    Adobe 色彩 系统 RGB 和 CMYK 相互转换原理 为了说明 adobe 的 RGB 转换 CMYK 的过程,不得不先涉及到一些色彩转换 程序 方面的东西. CMYK_ADOBE_COLORS ...

  8. 为什么RGB 与 CMYK的差异,会有所不同?

    RGB 与 CMYK 有什么区别 RGB 颜色模式用于设计网站和电视等数字通信.CMYK 颜色模式用于设计印刷通讯,如名片和海报. 这只是简单的区别.如果您有兴趣了解更多关于为什么这种差异很重要的信息 ...

  9. RGB转换成CMYK

    1:RGB色彩模式是发光的,存在于屏幕等显示设备中.不存在于印刷品中.CMYK色彩模式是反光的,需要外界辅助光源才能被感知,它是印刷品唯一的色彩模式. 2:色彩数量上RGB色域的颜色数比CMYK多出许 ...

  10. 常见色域基础知识与色域转换公式(YUV/YCbCr/YIQ/RGB/R‘G‘B‘/CMYK)

    目录 常见色域基础知识与色域转换公式(YUV/YCbCr/YIQ/RGB/R'G'B'/CMYK) 色域基础知识 RGB 色域 YUV/YIQ色域 CMYK色域 色域转换原理 色域转换公式 常见色域基 ...

最新文章

  1. linux expr命令
  2. 滤波器电路的Python仿真
  3. win32thread.c:(.text+0x60):对‘_beginthreadex’未定义的引用
  4. 什么版本测试通过就能发布?
  5. 机器学习之——学习率
  6. java 公因数_Java程序(最大公因数与最小公倍数)
  7. linux上创建RAID(磁盘阵列)与LVM(逻辑盘)
  8. 关于 ApacheCN 未来发展的思考 2019.5.20
  9. 用计算机弹假面骑士build,假面骑士build中只有资深粉丝才知道的梗第一弹
  10. C++ 获取URL图片、html文件,CInternetSession 【转】
  11. Web漏洞扫描工具AWVS12使用详解
  12. 华为手机序列号前三位_华为手机序列号查询真伪查询
  13. 网站建设备案和不备案的一些疑惑问题大全
  14. matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结
  15. 微信html5视频播放器,解决微信h5页面视频播放问题实例
  16. SSM 按模版导出 PDF
  17. 【2021自我知识蒸馏】Extracting knowledge from features with multilevel abstraction
  18. 选择器权重及字体属性
  19. python输入复数_如何在Python中作为用户输入获取复数?
  20. 软件编程c语言5级,全国青少年软件编程等级考试标准(c语言1级-10级)-20190927.pdf...

热门文章

  1. 酒桌上的学问(搜集整理帖)
  2. oracle数据如何采集,网页采集的数据如何导出到Oracle数据库 - 八爪鱼采集器
  3. 好站推荐-四个在线识别字体网站,从此不在为找字体烦恼
  4. mybatis多表联合查询
  5. 【UCSC Genome Browser】- Genes and Gene Predictions - NCBI RefSeq
  6. selenium调用edge driver的坑
  7. 计算机ppt里怎么应用背景图,如何在电脑ppt软件中添加背景图片
  8. 正点原子stm32F407 lcd.c 增加 画实心圆 函数
  9. 圆的面积函数定义及调用
  10. 解决远程服务器出现桌面和任务栏全无问题