如何检测jpeg是否包含cmyk颜色配置文件?

我有一些代码可以扩展用户上传的图像。 它在大多数情况下都能很好地工作,但有时它们会上传包含cmyk信息的jpeg。

谷歌搜索后,似乎jmygs与cmyk值无效,但由于它们在Windows中工作,用户认为这是我的应用程序的问题,所以我需要能够处理这些情况。 问题:

如何检测jpeg是否包含cmyk信息?(它允许我通知用户它为什么不起作用)。

如何将其转换为普通的jpeg?

在ASP.NET中,您可以在System.Drawing.Imaging.ImageFlags枚举的帮助下确定是否使用CMYK配置文件保存JPG,

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageflags(VS.80).aspx

假设您有一个基本的aspx页面,用户上传文件,您需要告诉,

1)是jpg吗? 2)是否使用RGB?

你的aspx可能是这样的,



然后为你的代码(C#)你可以做到,

 using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Click_submitButton(object sender, EventArgs e) { if (myUpload.HasFile && isUploadAJpeg(myUpload.PostedFile)) { System.Drawing.Bitmap uploadedImage = new System.Drawing.Bitmap(myUpload.PostedFile.InputStream); if (isFileACMYKJpeg(uploadedImage)) { feedback.Text = "The file is a CYMK jpg"; } else { feedback.Text = "This is a RGB jpg"; //it is a rgb jpg --> do something with it } } else { feedback.Text = "You did not upload a jpg"; } } protected bool isUploadAJpeg(HttpPostedFile someFile) { if (someFile.ContentType == "image/jpg" || someFile.ContentType == "image/jpeg" || someFile.ContentType == "image/pjpeg") { return true; } return false; } protected bool isFileACMYKJpeg(System.Drawing.Image someImage) { System.Drawing.Imaging.ImageFlags flagValues = (System.Drawing.Imaging.ImageFlags)Enum.Parse(typeof(System.Drawing.Imaging.ImageFlags), someImage.Flags.ToString()); if (flagValues.ToString().ToLower().IndexOf("ycck") == -1) { return false; } return true; } } 

希望有所帮助!

Jpeg是一个标准,支持在比特流内任意数量的编码平面(它们彼此独立压缩),因此具有cmyk配置文件的jpeg是完全有效的。 大多数jpeg文件使用jfif容器( http://en.wikipedia.org/wiki/JFIF )进行编码,该容器最初只支持灰度图像,YCbCr或sRGB,但它是可扩展的,Adobe有自定义标记来支持cmyk配置文件。

请查看此链接以获取解决方法http://www.jroller.com/greenhorn/entry/adobe_photoshop_and_jpeg_cmyk ,它位于java中,但您可以轻松将其移植到c#。