2009-01-15 27 views
8

Ich habe einen Code, der die hochgeladenen Bilder skaliert. Es funktioniert in den meisten Situationen perfekt, aber manchmal laden sie JPEGs hoch, die Cmyk-Informationen enthalten.Wie erkennt man, ob ein JPEG CMYK-Farbprofil enthält?

Nach googeln ein bisschen, es scheint wie jpegs mit CMYK-Werten ist nicht gültig, aber da sie in Windows arbeiten, gehen die Benutzer davon aus, dass es ein Problem mit meiner Anwendung ist, also muss ich in der Lage sein, mit diesen Situationen umzugehen. Die Fragen:

Wie erkenne ich, ob das JPEG Cmyk Informationen enthält (es würde mir erlauben, den Benutzer zu informieren, warum es nicht funktioniert).

Wie kann ich es in ein normales JPEG umwandeln?

Antwort

3

Jpeg ist ein Standard, der eine beliebige Anzahl von kodierten Ebenen unterstützt (sie werden unabhängig voneinander komprimiert) innerhalb eines Bitstroms, so dass ein JPEG mit einem Cmyk-Profil perfekt gültig ist. Die meisten JPEG-Dateien sind mit einem jfif-Container (http://en.wikipedia.org/wiki/JFIF) kodiert, der ursprünglich nur Graustufenbilder, YCbCr oder sRGB unterstützt, aber er ist erweiterbar und Adobe verfügt über ein benutzerdefiniertes Tag zur Unterstützung von cmyk-Profilen.

Werfen Sie einen Blick auf diesen Link für eine Problemumgehung http://www.jroller.com/greenhorn/entry/adobe_photoshop_and_jpeg_cmyk, es ist in Java, aber Sie können es leicht zu C# portieren.

+0

CMYK kann perfekt sein, aber manchmal zeigt IE das Bild nicht richtig. – davethegr8

+2

Ich sehe nicht, wie dies mit der Frage zusammenhängt, aber es scheint ein Problem/Einschränkung des IE zu sein. – Ismael

+0

Nun, Firefox 3 zeigt die Bilder, aber mit den "falschen" Farben. IE6 gibt der Box einfach ein rotes X. Sie entscheiden, welches besser ist. –

3

In ASP.NET können Sie bestimmen, ob ein JPG das CMYK-Profil mit Hilfe der System.Drawing.Imaging.ImageFlags Aufzählung gespeichert verwendet,

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

Lasst uns sagen, dass Sie eine grundlegende aspx haben Seite, wo ein Benutzer eine Datei hochlädt, und Sie müssen sagen,

1) ist es ein jpg? 2) benutzt es RGB?

Ihre aspx entlang der Linien sein könnte,

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

und dann hinter für Ihren Code (C#) können Sie tun,

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

Hoffnung, das hilft!

+0

Dies funktioniert nicht, da .NET immer noch abgehört wird (getestet unter 4.0): Es zeigt Farbprofil RGB für CMYK-Bilder, auch ist yck nicht das richtige Flag zum Überprüfen. Danke, dass du uns in die richtige Richtung geführt hast ;-) –

Verwandte Themen