English 中文(简体)
Image.Save question (save CMYK image to CMYK image)
原标题:

In Windows Forms Application, I m trying to open the image (CMYK tiff), add text, and then save back to CMYK tiff image, but when I opened the output image in Photoshop, it was RGB image (the colors looked different from the input image). Following is the code and I appreciate if you could help me.

Image^ chartImg = Image::FromFile( "user_chart.tif" );      
Graphics^ g = System::Drawing::Graphics::FromImage(chartImg);

String^ drawString = "Test test test test";
System::Drawing::Font^ drawFont = gcnew System::Drawing::Font("Arial", 9);
System::Drawing::SolidBrush^ drawBrush = gcnew             
System::Drawing::SolidBrush(System::Drawing::Color::Black);
float x = 100.0F;
float y = 10.0F;
System::Drawing::StringFormat^ strFormat = gcnew System::Drawing::StringFormat();
g->DrawString(drawString, drawFont, drawBrush, x, y, strFormat);

chartImg->Save("user_chart2.tif", System::Drawing::Imaging::ImageFormat::Tiff);
问题回答

What you are attempting to do is impossible with WinForms and GDI+. It does not contain the proper encoders/decoders to handle CMYK TIFFs.

When a CMYK TIFF is opened it has to be converted to RGB, changes made - and then converted back to CMYK.

The CMYK color space is device dependent and thus you would need to use LibTIFF and LittleCMS to read the CMYK TIFF into a buffer, convert it to RGB using an appropriate profile, add the text and convert it back. All of this requires the use ICC or ICM profiles.

It is possible to write code that will write directly to a CMYK TIFF however they are stored in "planes" of C, M, Y, K data.

Resort to a solution that uses C++ and LibTIFF/LittleCMS and you will have better luck.

Perhaps another option is WPF which I believe opens additional doors with various image encoder/decoders but I m not expert on that.





相关问题
Bring window to foreground after Mutex fails

I was wondering if someone can tell me what would be the best way to bring my application to the foreground if a mutex was not able to be created for a new instance. E.g.: Application X is running ...

How to start WinForm app minimized to tray?

I ve successfully created an app that minimizes to the tray using a NotifyIcon. When the form is manually closed it is successfully hidden from the desktop, taskbar, and alt-tab. The problem occurs ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

Handle DataTable.DataRow cell change event

I have a DataTable that has several DataColumns and DataRow. Now i would like to handle an event when cell of this DataRow is changed. How to do this in c#?

Apparent Memory Leak in DataGridView

How do you force a DataGridView to release its reference to a bound DataSet? We have a rather large dataset being displayed in a DataGridView and noticed that resources were not being freed after the ...

ALT Key Shortcuts Hidden

I am using VS2008 and creating forms. By default, the underscore of the character in a textbox when using an ampersand is not shown when I run the application. ex. "&Goto Here" is not ...

WPF-XAML window in Winforms Application

I have a Winforms application coded in VS C# 2008 and want to insert a WPF window into the window pane of Winforms application. Could you explain me how this is done.

热门标签