【问题标题】:How to detect if a jpeg contains cmyk color profile?如何检测 jpeg 是否包含 cmyk 颜色配置文件?
【发布时间】:2017-01-13 05:06:49
【问题描述】:

我有一些代码可以缩放用户上传的图片。它在大多数情况下都能完美运行,但有时他们会上传包含 cmyk 信息的 jpeg。

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

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

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

【问题讨论】:

    标签: c# jpeg


    【解决方案1】:

    在 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;
        }
    }
    

    希望有帮助!

    【讨论】:

    • 这不起作用,因为 .NET 仍然存在漏洞(在 4.0 上测试):它显示 CMYK 图片的颜色配置文件 RGB,而且 ycck 不是要检查的正确标志。感谢您带领我们朝着正确的方向前进;-)
    【解决方案2】:

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

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

    【讨论】:

    • CMYK 可能完全有效,但有时 IE 无法正确显示图像。
    • 我看不出这与问题有什么关系,但这似乎是 IE 的问题/限制。
    • 好吧,Firefox 3 确实显示了图像,但使用了“错误”的颜色。 IE6 只是简单地给出一个红色 X 的框。您决定哪个更好。
    • 我仍然看不到这与这里的问题有什么关系,问题是“如何检测 CMYK jpeg 文件”。 jpeg 标准旨在涵盖广泛的静态图片、16 位、多平面、无损编码等。最常见的容器是 jfif,最常见的选项是以 YCbCr 格式存储,这是大多数程序支持的格式.支持其他色彩空间是一个可取的功能,但我认为这不是网络浏览器开发人员最关心的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2013-01-26
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多