Как определить, содержит ли jpeg цветовой профиль cmyk?

У меня есть код, который масштабирует загружаемые пользователями изображения. В большинстве случаев он отлично работает, но иногда они загружают файлы в формате JPEG, содержащие информацию о cmyk.

После небольшого поиска в Google кажется, что jpeg со значениями cmyk недействительны, но, поскольку они работают в Windows, пользователи предполагают, что это проблема с моим приложением, поэтому мне нужно уметь справляться с такими ситуациями. Вопросы:

Как определить, содержит ли jpeg информацию cmyk? (это позволит мне сообщить пользователю, почему это не работает).

Как я могу преобразовать его в обычный jpeg?


person Community    schedule 15.01.2009    source источник


Ответы (2)


В ASP.NET вы можете определить, сохранен ли JPG с использованием профиля CMYK с помощью перечисления System.Drawing.Imaging.ImageFlags,

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>

а затем для вашего кода (С#) вы можете сделать,

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

Надеюсь, это поможет!

person Anjisan    schedule 06.08.2009
comment
Это не работает, так как .NET все еще содержит ошибки (проверено на 4.0): он показывает цветовой профиль RGB для изображений CMYK, также ycck не является правильным флагом для проверки. Спасибо, что ведете нас в правильном направлении жестко;-) - person Michiel Cornille; 06.12.2011

Jpeg — это стандарт, который поддерживает любое количество закодированных плоскостей (они сжимаются независимо друг от друга) внутри битового потока, поэтому JPEG с профилем cmyk вполне допустим. Большинство файлов 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#.

person Ismael    schedule 15.01.2009
comment
CMYK может быть вполне допустимым, однако иногда IE не отображает изображение должным образом. - person davethegr8; 19.03.2009
comment
Я не понимаю, как это связано с вопросом, но, похоже, это проблема/ограничение IE. - person Ismael; 19.03.2009
comment
Ну, Firefox 3 действительно отображает изображения, но с неправильными цветами. IE6 просто ставит квадратик с красным крестиком. Вы сами решаете, что лучше. - person Randy Stegbauer; 28.04.2009
comment
Я до сих пор не понимаю, как это связано с вопросом здесь, вопрос «Как обнаружить файл CMYK jpeg». Стандарт jpeg предназначен для охвата широкого спектра неподвижных изображений, 16-битных, нескольких плоскостей, кодирования без потерь и т. д. Наиболее распространенным контейнером является jfif, и наиболее распространенными вариантами является сохранение в формате YCbCr, который поддерживает большинство программ. . Поддержка других цветовых пространств является желательной функцией, но я не думаю, что это является основной задачей разработчиков веб-браузеров. - person Ismael; 28.04.2009