Skip to main content
Inspiring
December 1, 2024
Question

indesign plug-in develop,how to conver rgb to cmyk?

  • December 1, 2024
  • 2 replies
  • 515 views

In InDesign plugin development, I want to perform color conversions, such as converting colors from RGB, HSB, and other color spaces to the CMYK color space. I found that the SDK provides the IColorConverter interface that can accomplish this functionality, but I haven’t figured out how to use it or how to obtain a pointer to the interface object. However, the SDK documentation and sample code do not provide any guidance or examples on this topic. Does anyone have sample code related to this?

This topic has been closed for replies.

2 replies

Legend
December 2, 2024

On your original question: Let's look at the object model (not the scripting one). I generate such reports on my own, but you can also grep the SDK docs.

 

There is only one implementation of IColorConverter, aggregated on the kACEColorSpaceMgrBoss. The name suggests it deals with all those color spaces. Answering Willi, usage of "Adobe Color Engine" / ACE is exactly the question here. Some generic cross application engine, and associated wrapper interfaces to access them the InDesign way. Main interface should be IColorSpaceMgr. It is also a service provider, so you could get a hold via service registry, asking for kColorSpaceMgrService if there were no dedicated Utils function. Yup, see IGraphicsUtils.

 

Regarding your graphics port, there are 20+ boss classes that aggregate the interface, 5 different implementations of the interface itself if I did not miss one, and there are plenty ways to reach them. Receive a pointer during a drawing operation (draw event of a layout window, or is it a widget in a panel, some ongoing export) or did you create it yourself? The window may vary regarding preview mode, active separations preview and so forth. All of this configured in some way or the other. So the question is still open how you reach yours.

 

If this is about the composer of your other thread, IGraphicsPort is the wrong means of output. You're supposed to produce the various IWax objects. Think of a "display list". The composer is not involved in drawing. Open a document created in InDesign CS 20 years ago and the latest & greatest composer is not triggered, InDesign will instead render the wax.

 

For usage I'd myself search the SDK (how often is ColorSpace mentioned in IGraphicsPort.h, oh - Rendering Intent sounds like something), write a test plugin, construct several test cases, and if it gets tough set breakpoints and wade thru assembler code for a few days. Know your tools (Xcode, VStudio) and those provided via the SDK (headers, docs, ITK …).

lyj2871Author
Inspiring
December 2, 2024

 

Thank you for your reply. When using the IGraphicsPort interface and directly calling setcmykcolor(1, 0, 0, 0), the color displayed on the screen is indeed incorrect, but the exported PDF shows the correct color. However, when using the following two functions to set CMYK colors:

 

cpp
复制代码
virtual void setcolorspace(AGMColorSpace* colorSpace) = 0; virtual void setcolorvalues(const float* colorVals) = 0;
 

the colors rendered on the screen and in the exported PDF are both correct. I have already obtained the pointer to AGMColorSpace using IColorSystemUtils.

Willi Adelberger
Community Expert
Community Expert
December 1, 2024

Why do you need it. WHat should it what Adobe's Colormanagement and Adobe Color Engine cannot not do? That is built in functionality in all CC Print applications.

lyj2871Author
Inspiring
December 1, 2024

When I use the IGraphicsPort interface to draw some text, I need to display the color in the CMYK color space with C=100, M=0, Y=0, K=0. I called the color setting function g_port->setcmykcolor(1,0,0,0);, but the displayed color is incorrect. After carefully comparing the colors, I found that the displayed color is actually converted to an RGB color, and it matches R=0, G=160, B=233. So, do I also need to call the function virtual void setcolorspace(AGMColorSpace* colorSpace) = 0; to set the color space? I haven’t called this function yet. Also, I couldn’t find the definition of the AGMColorSpace parameter for this function. In the SDK, it’s always just a pointer. Where can I obtain this value?

Robert at ID-Tasker
Legend
December 1, 2024

@lyj2871

 

Is your document for display or for printing?