我有一些代码可以缩放用户上传的图像。它在大多数情况下都能完美运行,但有时他们会上传包含 cmyk 信息的 jpeg。
谷歌搜索了一下,似乎带有 cmyk 值的 jpeg 无效,但由于它们在 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 可能是这样的,
<form id="form1" runat="server" enctype="multipart/form-data">
<asp:FileUpload ID="myUpload" runat="server" />
<asp:Button ID="submitButton" runat="server" Text="Submit" OnClick="Click_submitButton" />
<br /><br />
<asp:Literal ID="feedback" runat="server" />
</form>
然后对于您的代码(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#。