创建CMYK + alpha位图,将黑色映射到特定的CMYK颜色

时间:2015-09-14 16:40:19

标签: .net pdf colors bitmap abcpdf

给定这个拱形文本图像,透明背景上的黑色像素,带抗锯齿

arched text, RGB black on transparent

我最终希望对此文本进行CMYK渲染,其中每个黑色像素都会变成特定的CMYK颜色,例如品红色或{72,36,9,28},或者客户指定的任何颜色。最终输出将是PDF。每个透明像素都需要保持透明,因为文本下可能还有其他PDF对象。

我满足于写入磁盘的CMYK + Alpha TIFF等价物。或者,可能是System.Windows.Media.Imaging.Bitmapimage。或者别的什么。

我的PDF库是ABCpdf.NET 10.我意识到System.Drawing不支持CMYK颜色格式。我对其他第三方图书馆也很好;我已经在库中的另一个上下文中使用AForge了。

想要进行RGB到CMYK转换,甚至没有配置文件。我希望在PDF中进行通用颜色替换。我的客户将指定一个明确的CMYK目标颜色,我需要完全匹配它;在RGB近似上使用颜色转换是不行的。

我已经挥舞着各种各样的东西。我得到的最接近的是交换颜色,同时保持RGB - 黑色变得透明,透明变成白色 - 并在图像下面绘制一个填充的洋红色框。然后绘制文本不是白色像素,下面的洋红色显示通过。被视为一个群体,最终看起来像白色的扭曲的洋红色文本。但是,任何坐在小组下面的东西都没有显示出来。 link

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在websupergoo的Jos Vernon提出了一个使用ABCpdf功能的非常简单的答案。

using WebSupergoo.ABCpdf10;
using WebSupergoo.ABCpdf10.Objects;

namespace RecolorRenderedImage
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Doc theDoc = new Doc()) {
                // this background image is there to prove that the text is not obscuring other pdf objects
                theDoc.AddImage("c:\\temp\\background-pic.jpg");

                // this is the black warped text
                string fullFilePath = "c:\\temp\\foobar.png";

                // read it into an XImage. Add to the doc, and retrieve the pixmap
                XReadOptions readOptions = new XReadOptions();
                XImage image = XImage.FromFile(fullFilePath, readOptions);
                int theID = theDoc.AddImageObject(image, true);
                int imageID = theDoc.GetInfoInt(theID, "XObject");
                PixMap thePM = (PixMap)theDoc.ObjectSoup[imageID];

                // recolor the pixmap temporary spot color space with the desired color (gold in this case)
                int spotColorID = theDoc.AddColorSpaceSpot("tempSpace", "24 44 100 2");
                ColorSpace theSP = (ColorSpace)theDoc.ObjectSoup[spotColorID];
                thePM.Recolor(theSP);

                // immediately recolor the pixmap back to CMYK
                ColorSpace theSP2 = new ColorSpace(theDoc.ObjectSoup, ColorSpaceType.DeviceCMYK);
                thePM.Recolor(theSP2);

                theDoc.Save("c:\\temp\\test.pdf");
            }
        }

    }
}

output file在图片上显示金色文字