Frage

Zuerst möchte ich die Situation/Anforderungen erklären, die zur Frage führen:

In unserer Webanwendung können wir CMYK -Bilder (JPEG) nicht unterstützen, da IE 8 und unten nicht angezeigt werden kann. Daher müssen wir erkennen, wenn jemand ein solches Bild hochladen und es leugnen möchte.

Leider wird Javas Imageio diese Bilder nicht lesen oder es mir nicht ermöglichen, den erkannten Farbraum zu erhalten. Vom Debuggen scheint es wie JPEGImageReader Innen erhält der Farbraumcode 11 (was bedeuten würde JCS_YCCK) Aber ich kann auf diese Informationen nicht sicher zugreifen.

Wenn ich den Leser nach den Bildtypen abfrage, bekomme ich nichts für CMYK, also könnte ich annehmen no image types = unsupported image.

Ich habe das Quell -CMYK -Bild mit einem Bildgebungstool in RGB konvertiert, um zu testen, ob es dann lesbar wäre (ich habe versucht, die Schritte des Administrators zu simulieren, wenn die Nachricht "Nein CMYK unterstützt" abgerufen wird). Jedoch, JPEGImageReader würde dieses Bild nicht lesen, da es geht davon aus (Kommentar in der Quell IllegalArgumentException ist geworfen.

Daher ist Imageio keine Option, da ich den Farbraum eines Bildes nicht zuverlässig erhalten kann und den Administrator nicht mitteilen kann, warum ein ansonsten fein Error.

Dies führte mich dazu, Jai Imageio zu probieren, dessen CLibJPEGImageReader Macht einen hervorragenden Job und liest alle meine Testbilder richtig.

Da wir jedoch unsere Anwendung in einem JBOSS einsetzen, das auch andere Anwendungen hosten, möchten wir sie so isoliert wie möglich halten. Afaik, ich müsste Jai Imageio an der JRE installieren oder die nativen Libs auf andere Weise zur Verfügung stellen, um sie zu verwenden, und daher können auch andere Anwendungen Zugriff auf sie erhalten, was zu Nebenwirkungen führen kann (zumindest hätten wir wir viel zu testen, um sicherzustellen, dass dies nicht der Fall ist).

Das ist die Erklärung für die Frage, und hier kommt sie wieder:Gibt es eine reine Java -Alternative zu Jai Imageio, die CMYK -Bilder zuverlässig erkennt und möglicherweise konvertiert?

Danke im Voraus,

Thomas

War es hilfreich?

Lösung

Ich habe eine Lösung gefunden, die für unsere Bedürfnisse in Ordnung ist: Apache Commons Sanselan. Diese Bibliothek liest JPEG -Header ziemlich schnell und genau (zumindest alle meine Testbilder) sowie eine Reihe anderer Bildformate.

Der Nachteil ist, dass es JPEG -Bilddaten nicht liest, aber ich kann dies mit den grundlegenden JRE -Tools tun.

Das Lesen von JPEG -Bildern zur Konvertierung ist recht einfach (diejenigen, die ImageIO weigert sich auch zu lesen):

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream( new File(pFilename) ) );
BufferedImage sourceImg = decoder.decodeAsBufferedImage();

Wenn Sanselan mir dann sagt, dass das Bild tatsächlich CMYK ist, bekomme ich den Raster des Quellbildes und wandelte mich selbst um:

for( /*each pixel in the raster, which is represented as int[4]*/ )
{  
   double k = pixel[3] / 255.0;

   double r = (255.0 - pixel[0])*k;
   double g = (255.0 - pixel[1])*k;
   double b = (255.0 - pixel[2])*k;
}

Dies ergibt recht gute Ergebnisse, dass die RGB -Bilder nicht zu hell oder dunkel sind. Ich bin mir jedoch nicht sicher, warum sich vermehren k verhindert das Aufhellen. Der JPEG ist tatsächlich in nativem Code dekodiert und die CMYK-> RGB-Konvertierung, die ich etwas anderes bekam. Ich habe nur das Multiplikum versucht, das visuelle Ergebnis zu sehen.

Wenn jemand etwas Licht darüber werfen könnte, wäre ich dankbar.

Andere Tipps

Ich habe eine reine Java gepostet Lösung Für das Lesen aller möglichen JPEG -Bilder und zum Konvertieren in RGB.

Es basiert auf den folgenden Fakten:

  • Während Imageio JPEG -Bilder mit CMYK nicht als gepuffertes Bild lesen kann, kann es die Rohpixeldaten (Raster) lesen.
  • Sansselan (oder Apache Commons -Bildgebung, wie es jetzt genannt wird) kann verwendet werden, um die Details von CMYK -Bildern zu lesen.
  • Es gibt Bilder mit umgekehrten CMYK -Werten (einen alten Photoshop -Fehler).
  • Es gibt Bilder mit YCCK anstelle von CMYK (kann leicht konvertiert werden).

In unserer Webanwendung können wir CMYK -Bilder (JPEG) nicht unterstützen, da IE 8 und unten nicht angezeigt werden kann. Daher müssen wir erkennen, wenn jemand ein solches Bild hochladen und es leugnen möchte.

Ich stimme deinem nicht zu "Daher müssen wir erkennen, wenn jemand ein solches Bild hochladen und es verweigern möchte.". Eine viel benutzerfreundlichere Richtlinie wäre, sie in etwas anderes als CMYK umzuwandeln.

Der Rest Ihres Beitrags ist etwas verwirrend, da Sie sowohl nach Erkennung als auch Umwandlung bitten, die zwei verschiedene Dinge sind. Ich denke, das Konvertieren des Bildes ist wieder viel benutzerfreundlicher.

Es ist nicht erforderlich, übrigens fett zu schreiben:

Gibt es eine reine Java -Alternative zu Jai Imageio, die CMYK -Bilder zuverlässig erkennt und möglicherweise konvertiert?

Pure Java, ich weiß nicht, aber Imagemagick funktioniert gut, um CMYK -Image in RGB -Bild zu konvertieren. Berufung Imagemagick Auf der Serverseite von Java ist wirklich nicht kompliziert. Ich habe es früher manuell gemacht, indem ich einen externen Prozess aufgerufen habe, aber heutzutage gibt es Wrapper wie JMagick und IM4java.

Achten Sie auf einen anderen Beitrag, da die Java 7 nicht erlaubt, die direkte Implementierung von Sun ohne spezielle Parameter wie in angegeben importieren com.sun.image.codec.jpeg.*.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top