Как определить, содержит ли jpeg цветовой профиль cmyk? - PullRequest
8 голосов
/ 15 января 2009

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 06 августа 2009

В 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>

и затем для вашего кода (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;
    }
}

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

3 голосов
/ 15 января 2009

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 #.

...