明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3492|回复: 4

[求助]CAD下四色(CMYK)转三色(RGB)

[复制链接]
发表于 2008-2-25 12:01 | 显示全部楼层 |阅读模式

各位是否注意新的图式采用的是四色即青、品红、黄、黑(CMYK)而目前CAD只有三色红、绿、蓝(RGB)(至少CAD2004还是三色)如和在CAD下完成四色图的编辑,需要把(CMYK)转换成对应的(RGB)请问有没有好的方法,能用程序达到就更好了。

发表于 2008-3-9 00:22 | 显示全部楼层
本帖最后由 作者 于 2008-3-9 0:25:22 编辑
  1. Adobe 色彩系统 RGB 和 CMYK 相互转换原理
  2. 为了说明 adobe 的 RGB 转换 CMYK 的过程,不得不先涉及到一些色彩转换程序方面的东西。
  3. CMYK_ADOBE_COLORSPACE:
  4. r = (k*c)/maxval;
  5. g = (k*m)/maxval;
  6. b = (k*y)/maxval;
  7. 以上是 adobe 的 CMYK 到 RGB转换公式,下面再来看看 RGB 如何 转换为 CMYK
  8. 下面的语句是经过改写的适用于 Flash 的 actionscript
  9. // RGB to CMY 色彩转换
  10. function rgbtocmy () {
  11. mycyan = 255 - myred;
  12. mymagenta = 255 - mygreen;
  13. myyellow = 255 - myblue;
  14. correctCMYK();
  15. }
  16. // CMY to RGB 色彩转换
  17. function cmytorgb () {
  18. myred = 255 - mycyan;
  19. mygreen = 255 - mymagenta;
  20. myblue = 255 - myyellow;
  21. correctCMYK();
  22. }
  23. // CMYK 色彩修正
  24. function correctCMYK () {
  25. if (rep_v != "ERR") {
  26. var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
  27. if (temp != 0) {
  28. temp2 = Math.round((rep_v / 100) * temp);
  29. rep_k = Math.round((temp2 / 255) * 100);
  30. rep_c = Math.round(((mycyan - temp2) / 255) * 100);
  31. rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
  32. rep_y = Math.round(((myyellow - temp2) / 255) * 100);
  33. } else {
  34. rep_c = Math.round((mycyan / 255) * 100);
  35. rep_m = Math.round((mymagenta / 255) * 100);
  36. rep_y = Math.round((myyellow / 255) * 100);
  37. rep_k = 0;
  38. }
  39. }
  40. }
  41. // RGB to CMY 色彩转换
  42. function rgbtocmy () {
  43. mycyan = 255 - myred;
  44. mymagenta = 255 - mygreen;
  45. myyellow = 255 - myblue;
  46. correctCMYK();
  47. }
  48. // CMY to RGB 色彩转换
  49. function cmytorgb () {
  50. myred = 255 - mycyan;
  51. mygreen = 255 - mymagenta;
  52. myblue = 255 - myyellow;
  53. correctCMYK();
  54. }
  55. // CMYK 色彩修正
  56. function correctCMYK () {
  57. if (rep_v != "ERR") {
  58. var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
  59. if (temp != 0) {
  60. temp2 = Math.round((rep_v / 100) * temp);
  61. rep_k = Math.round((temp2 / 255) * 100);
  62. rep_c = Math.round(((mycyan - temp2) / 255) * 100);
  63. rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
  64. rep_y = Math.round(((myyellow - temp2) / 255) * 100);
  65. } else {
  66. rep_c = Math.round((mycyan / 255) * 100);
  67. rep_m = Math.round((mymagenta / 255) * 100);
  68. rep_y = Math.round((myyellow / 255) * 100);
  69. rep_k = 0;
  70. }
  71. }
  72. }
  73. // RGB to CMY 色彩转换
  74. function rgbtocmy () {
  75. mycyan = 255 - myred;
  76. mymagenta = 255 - mygreen;
  77. myyellow = 255 - myblue;
  78. correctCMYK();
  79. }
  80. // CMY to RGB 色彩转换
  81. function cmytorgb () {
  82. myred = 255 - mycyan;
  83. mygreen = 255 - mymagenta;
  84. myblue = 255 - myyellow;
  85. correctCMYK();
  86. }
  87. // CMYK 色彩修正
  88. function correctCMYK () {
  89. if (rep_v != "ERR") {
  90. var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
  91. if (temp != 0) {
  92. temp2 = Math.round((rep_v / 100) * temp);
  93. rep_k = Math.round((temp2 / 255) * 100);
  94. rep_c = Math.round(((mycyan - temp2) / 255) * 100);
  95. rep_m = Math.round(((mymagenta - temp2) / 255) * 100);
  96. rep_y = Math.round(((myyellow - temp2) / 255) * 100);
  97. } else {
  98. rep_c = Math.round((mycyan / 255) * 100);
  99. rep_m = Math.round((mymagenta / 255) * 100);
  100. rep_y = Math.round((myyellow / 255) * 100);
  101. rep_k = 0;
  102. }
  103. }
  104. }
复制代码
如果看懂了用lisp改写一下!!

如果看懂了用lisp改写一下!!

我们知道, RGB 和 CMYK 并不能一一对应,这里面存在的问题是黑色部分的替换值的取值问题。
但是, RGB 所可以全部对应的,是CMY 格式,其最取值范围是0-255。从色轮上我们可以很容易的了解到这其中的补色计算关系。因此,CMY 和 RGB 的对换 可以说是“无损,可逆转”的。
当从RGB 得到相应的CMY 之后,我们若要得到 CMYK 值,就必须定义一个“黑色替换值”,也就是说提取各色通道中的若干成分来形成黑色通道。CMYK 的取值是 0-100。
这个“黑色替换值”的取值不同,得到的CMYK分量分布也就不同。也就是我们在photoshop里面可以选择 CMYK 的分色方案为 “UCR”或者“GCR”的不同。
“黑色替换值”越大,CMYK图像在印刷时的偏色几率就越小,但相应的状况是图片彩墨分量在暗黑部位显薄,不够饱和。这种分色方式适用于印刷材质较薄或较粗糙,印刷精度不高的场合。
附注:为什么直接去色和直接转换灰度比 Lab 的 L 通道得到的灰度层次显得差?
我们还是来用色彩转换公式说话来比较:
L = 0.3R+0.59G+0.11B
Gray = (R+G+B)/3
我们很容易就看出区别,平均取值的灰度和根据色彩明度增益比例混合的值是完全不同的。

发表于 2008-3-9 00:28 | 显示全部楼层
Math.Round (Double), 将双精度浮点值舍入为最接近的整数。
 楼主| 发表于 2008-3-10 22:11 | 显示全部楼层
谢谢,先下来研究一番。
 楼主| 发表于 2008-3-14 21:21 | 显示全部楼层

怪我才疏学浅,我看不懂特别是这句

if (rep_v != "ERR") {
var temp = Math.min(Math.min(mycyan, mymagenta), myyellow);
if (temp != 0) {
和lisp大不同能否告知公式方法,说的再明白些,或那位看明白的给“翻译”下,不胜感激!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 13:14 , Processed in 0.552945 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表