CMYK convert RGB
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相关推荐
- PIL image.convert('RGB')在数据生成中真的比较好吗?
1 致谢 感谢陈助教给我们讲述了人脸关键点检测的相关知识. 2 前言 虽然陈助教给我们讲了人脸关键点的知识,他在样本生成时用到了image.convert('RGB'),但是我在想这样做,真的好吗?
- mupdf中CMYK与RGB的转换算法
之前碰到过RGB与CMYK之间转换的问题,网上也没有比较官方的转换公式,不同的软件可能会采用不同的算法,现在mupdf,正好也看到了这样的算法,还是有一定参考价值的,具体算法如下: #define M ...
- HTML把cmyk转换为RGB,CMYK在线转换成pantone色卡号,cmyk转换对应潘通色号
Cyan(C) % Magenta(M) % Yellow(Y) % Key (black)K % 最接近的潘通色号是: 选择需要集中接近颜色 16 32 48 64 80 96 RGB : (255 ...
- 【转】“HSB”、“lab“、“CMYK“、“RGB“有什么区别?
"HSB"."lab"."CMYK"."RGB"有什么区别_百度知道 (baidu.com)https://zhidao ...
- Csharp: Winform 顏色選擇器 Color convert RGB and RGB convert Color
/// <summary>/// 選擇顏色/// </summary>/// <param name="sender"></param&g ...
- 【OpenCV3】RGB图像向CMYK颜色空间转换
1.RGB颜色空间 RGB(红色,绿色,蓝色)是表示光发射的颜色空间. RGB是一个加性色谱,当所有原色组合时,形成白色. 这类似于实际的光谱,如果您结合自然光的所有颜色(例如,彩虹上的所有颜色),则 ...
- RGB 和 CMYK 相互转换
Adobe 色彩 系统 RGB 和 CMYK 相互转换原理 为了说明 adobe 的 RGB 转换 CMYK 的过程,不得不先涉及到一些色彩转换 程序 方面的东西. CMYK_ADOBE_COLORS ...
- 为什么RGB 与 CMYK的差异,会有所不同?
RGB 与 CMYK 有什么区别 RGB 颜色模式用于设计网站和电视等数字通信.CMYK 颜色模式用于设计印刷通讯,如名片和海报. 这只是简单的区别.如果您有兴趣了解更多关于为什么这种差异很重要的信息 ...
- RGB转换成CMYK
1:RGB色彩模式是发光的,存在于屏幕等显示设备中.不存在于印刷品中.CMYK色彩模式是反光的,需要外界辅助光源才能被感知,它是印刷品唯一的色彩模式. 2:色彩数量上RGB色域的颜色数比CMYK多出许 ...
- 常见色域基础知识与色域转换公式(YUV/YCbCr/YIQ/RGB/R‘G‘B‘/CMYK)
目录 常见色域基础知识与色域转换公式(YUV/YCbCr/YIQ/RGB/R'G'B'/CMYK) 色域基础知识 RGB 色域 YUV/YIQ色域 CMYK色域 色域转换原理 色域转换公式 常见色域基 ...
最新文章
- linux expr命令
- 滤波器电路的Python仿真
- win32thread.c:(.text+0x60):对‘_beginthreadex’未定义的引用
- 什么版本测试通过就能发布?
- 机器学习之——学习率
- java 公因数_Java程序(最大公因数与最小公倍数)
- linux上创建RAID(磁盘阵列)与LVM(逻辑盘)
- 关于 ApacheCN 未来发展的思考 2019.5.20
- 用计算机弹假面骑士build,假面骑士build中只有资深粉丝才知道的梗第一弹
- C++ 获取URL图片、html文件,CInternetSession 【转】
- Web漏洞扫描工具AWVS12使用详解
- 华为手机序列号前三位_华为手机序列号查询真伪查询
- 网站建设备案和不备案的一些疑惑问题大全
- matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结
- 微信html5视频播放器,解决微信h5页面视频播放问题实例
- SSM 按模版导出 PDF
- 【2021自我知识蒸馏】Extracting knowledge from features with multilevel abstraction
- 选择器权重及字体属性
- python输入复数_如何在Python中作为用户输入获取复数?
- 软件编程c语言5级,全国青少年软件编程等级考试标准(c语言1级-10级)-20190927.pdf...
热门文章
- 酒桌上的学问(搜集整理帖)
- oracle数据如何采集,网页采集的数据如何导出到Oracle数据库 - 八爪鱼采集器
- 好站推荐-四个在线识别字体网站,从此不在为找字体烦恼
- mybatis多表联合查询
- 【UCSC Genome Browser】- Genes and Gene Predictions - NCBI RefSeq
- selenium调用edge driver的坑
- 计算机ppt里怎么应用背景图,如何在电脑ppt软件中添加背景图片
- 正点原子stm32F407 lcd.c 增加 画实心圆 函数
- 圆的面积函数定义及调用
- 解决远程服务器出现桌面和任务栏全无问题