TwelveMonkeys ImageIO bietet erweiterte Unterstützung für Bilddateiformate für die Java-Plattform durch Plugins für das Paket javax.imageio.*
.
Das Hauptziel dieses Projekts besteht darin, Unterstützung für Dateiformate bereitzustellen, die nicht vom JDK abgedeckt werden. Die Unterstützung dieser Formate ist wichtig, um „in freier Wildbahn“ gefundene Daten lesen zu können und um den Zugriff auf Daten in älteren Formaten aufrechtzuerhalten. Da es viele Altdaten gibt, sehen wir die Notwendigkeit offener Implementierungen von Readern für gängige Formate.
Plugin | Format | Beschreibung | R | W | Metadaten | Notizen |
---|---|---|---|---|---|---|
Batik | SVG | Skalierbare Vektorgrafiken | ✔ | - | - | Erfordert Batik |
WMF | MS Windows-Metadatei | ✔ | - | - | Erfordert Batik | |
BMP | BMP | Geräteunabhängige Bitmap für MS Windows und IBM OS/2 | ✔ | ✔ | Nativ, Standard | |
CUR | MS Windows-Cursorformat | ✔ | - | - | ||
ICO | MS Windows-Symbolformat | ✔ | ✔ | - | ||
DDS | DDS | MS Direct Draw-Oberflächenformat | ✔ | - | Standard | |
HDR | HDR | Radiance High Dynamic Range RGBE-Format | ✔ | - | Standard | |
ICNS | ICNS | Apple-Symbolbild | ✔ | ✔ | - | |
IFF | IFF | Commodore Amiga/Electronic Arts Interchange-Dateiformat | ✔ | ✔ | Standard | |
JPEG | JPEG | Gemeinsame Expertengruppe für Fotografen | ✔ | ✔ | Nativ, Standard | |
JPEG verlustfrei | ✔ | - | Nativ, Standard | |||
PCX | PCX | ZSoft Paintbrush-Format | ✔ | - | Standard | |
DCX | Mehrseitiges PCX-Faxdokument | ✔ | - | Standard | ||
BILD | BILD | Apple QuickTime-Bildformat | ✔ | ✔ | Standard | |
PNGG | Apple MacPaint-Bildformat | ✔ | - | Standard | ||
PNM | PAM | NetPBM Portable Jede Karte | ✔ | ✔ | Standard | |
PBM | NetPBM Portable Bitmap | ✔ | - | Standard | ||
PGM | Tragbare Graukarte von NetPBM | ✔ | - | Standard | ||
PPM | NetPBM Portable Pix Map | ✔ | ✔ | Standard | ||
PFM | Tragbare Float-Karte | ✔ | - | Standard | ||
PSD | PSD | Adobe Photoshop-Dokument | ✔ | (✔) | Nativ, Standard | |
PSB | Großes Adobe Photoshop-Dokument | ✔ | - | Nativ, Standard | ||
SGI | SGI | Silicon Graphics-Bildformat | ✔ | - | Standard | |
TGA | TGA | Truevision TGA-Bildformat | ✔ | ✔ | Standard | |
ThumbsDB | Thumbs.db | MS Windows Thumbs DB | ✔ | - | - | Nur auf OLE2 Compound Document basierendes Format |
TIFF | TIFF | Aldus/Adobe-Tagged-Image-Dateiformat | ✔ | ✔ | Nativ, Standard | |
BigTIFF | ✔ | ✔ | Nativ, Standard | |||
WebP | WebP | Google WebP-Format | ✔ | - | Standard | |
XWD | XWD | X11-Fenster-Dump-Format | ✔ | - | Standard |
Wichtiger Hinweis zur Verwendung von Batik: Bitte lesen Sie „The Apache™ XML Graphics Project – Sicherheit“ und stellen Sie sicher, dass Sie eine aktualisierte und sichere Version verwenden.
Beachten Sie, dass die Formate GIF, PNG und WBMP bereits über die ImageIO-API unter Verwendung der JDK-Standard-Plugins unterstützt werden. Für die Formate BMP, JPEG und TIFF bieten die TwelveMonkeys-Plugins erweiterte Formatunterstützung und zusätzliche Funktionen.
Meistens müssen Sie lediglich die Plugins in Ihr Projekt einbinden und schreiben:
BufferedImage image = ImageIO . read ( file );
Dadurch wird das erste Bild der Datei vollständig in den Speicher geladen.
Die grundlegende und einfachste Form des Schreibens ist:
if (! ImageIO . write ( image , format , file )) {
// Handle image not written case
}
Dadurch wird das gesamte Bild in eine einzige Datei geschrieben, wobei die Standardeinstellungen für das angegebene Format verwendet werden.
Die Plugins werden zur Laufzeit automatisch erkannt. Weitere Informationen zur Funktionsweise dieses Mechanismus finden Sie in den FAQ.
Wenn Sie mehr Kontrolle über die Leseparameter und den Lesevorgang benötigen, lautet die gebräuchliche Redewendung für das Lesen etwa so:
// Create input stream (in try-with-resource block to avoid leaks)
try ( ImageInputStream input = ImageIO . createImageInputStream ( file )) {
// Get the reader
Iterator < ImageReader > readers = ImageIO . getImageReaders ( input );
if (! readers . hasNext ()) {
throw new IllegalArgumentException ( "No reader for: " + file );
}
ImageReader reader = readers . next ();
try {
reader . setInput ( input );
// Optionally, listen for read warnings, progress, etc.
reader . addIIOReadWarningListener (...);
reader . addIIOReadProgressListener (...);
ImageReadParam param = reader . getDefaultReadParam ();
// Optionally, control read settings like sub sampling, source region or destination etc.
param . setSourceSubsampling (...);
param . setSourceRegion (...);
param . setDestination (...);
// ...
// Finally read the image, using settings from param
BufferedImage image = reader . read ( 0 , param );
// Optionally, read thumbnails, meta data, etc...
int numThumbs = reader . getNumThumbnails ( 0 );
// ...
}
finally {
// Dispose reader in finally block to avoid memory leaks
reader . dispose ();
}
}
Fragen Sie den Reader mit reader.getWidth(n)
und reader.getHeight(n)
nach den Abmessungen des Quellbilds ab, ohne zuerst das gesamte Bild in den Speicher einzulesen.
Mit reader.getNumImages()
ist es auch möglich, mehrere Bilder aus derselben Datei in einer Schleife zu lesen.
Wenn Sie mehr Kontrolle über die Schreibparameter und den Schreibvorgang benötigen, lautet die übliche Schreibsprache etwa so:
// Get the writer
Iterator < ImageWriter > writers = ImageIO . getImageWritersByFormatName ( format );
if (! writers . hasNext ()) {
throw new IllegalArgumentException ( "No writer for: " + format );
}
ImageWriter writer = writers . next ();
try {
// Create output stream (in try-with-resource block to avoid leaks)
try ( ImageOutputStream output = ImageIO . createImageOutputStream ( file )) {
writer . setOutput ( output );
// Optionally, listen to progress, warnings, etc.
ImageWriteParam param = writer . getDefaultWriteParam ();
// Optionally, control format specific settings of param (requires casting), or
// control generic write settings like sub sampling, source region, output type etc.
// Optionally, provide thumbnails and image/stream metadata
writer . write (..., new IIOImage (..., image , ...), param );
}
}
finally {
// Dispose writer in finally block to avoid memory leaks
writer . dispose ();
}
Für eine fortgeschrittenere Nutzung und Informationen zur Verwendung der ImageIO-API empfehle ich Ihnen, den Java Image I/O API Guide von Oracle zu lesen.
import com . twelvemonkeys . imageio . path . Paths ;
...
try ( ImageInputStream stream = ImageIO . createImageInputStream ( new File ( "image_with_path.jpg" )) {
BufferedImage image = Paths . readClipped ( stream );
// Do something with the clipped image...
}
Weitere Details und Beispielcode finden Sie unter Adobe Clipping Path-Unterstützung im Wiki.
Die Bibliothek verfügt über einen Resampling-Vorgang (Bildgrößenänderung), der viele verschiedene Algorithmen enthält, um hervorragende Ergebnisse bei angemessener Geschwindigkeit zu liefern.
import com . twelvemonkeys . image . ResampleOp ;
...
BufferedImage input = ...; // Image to resample
int width , height = ...; // new width/height
BufferedImageOp resampler = new ResampleOp ( width , height , ResampleOp . FILTER_LANCZOS ); // A good default filter, see class documentation for more info
BufferedImage output = resampler . filter ( input , null );
Die Bibliothek verfügt über eine Dithering-Operation, die zum Konvertieren BufferedImage
s in IndexColorModel
mithilfe von Floyd-Steinberg-Fehlerdiffusions-Dithering verwendet werden kann.
import com . twelvemonkeys . image . DiffusionDither ;
...
BufferedImage input = ...; // Image to dither
BufferedImageOp ditherer = new DiffusionDither ();
BufferedImage output = ditherer . filter ( input , null );
Wenn Sie die normalen Muster zum Laden von Bildern verwenden, führt der Versuch, ein beschädigtes Bild zu laden, dazu, dass eine IOException
ausgelöst wird.
BufferedImage image = null ;
try {
image = ImageIO . read ( file );
} catch ( IOException exception ) {
// Handle, log a warning/error etc
}
Wenn in diesem Szenario das Bild beschädigt ist und ImageIO.read
eine Ausnahme auslöst, ist image
immer noch null
– es ist für eine Funktion nicht möglich, sowohl einen Wert zurückzugeben als auch eine Ausnahme auszulösen.
In manchen Fällen ist es jedoch möglich, aus einem beschädigten Bild brauchbare Bilddaten zu gewinnen. Dies erreichen Sie, indem Sie ein ImageReadParam
verwenden, um ein BufferedImage
als Ziel festzulegen.
int width = reader . getWidth ( 0 );
int height = reader . getHeight ( 0 );
ImageTypeSpecifier imageType = reader . getRawImageType ( 0 );
BufferedImage image = imageType . createBufferedImage ( width , height );
ImageReadParam param = reader . getDefaultReadParam ();
param . setDestination ( image );
try {
reader . read ( 0 , param );
}
catch ( IOException e ) {
// Handle, log a warning/error etc
}
Theoretisch sollte dies für alle Plugins funktionieren, aber das Ergebnis ist sehr Plugin-/Implementierungsspezifisch. Bei einigen Formaten und einigen Formen beschädigter Dateien erhalten Sie möglicherweise ein Bild, das am meisten nützlich ist. Sie sollten jedoch auf die Möglichkeit vorbereitet sein, dass dadurch lediglich ein leeres oder leeres Bild entsteht.
Laden Sie das Projekt herunter (mit Git):
$ git clone [email protected]:haraldk/TwelveMonkeys.git
Dadurch sollte ein Ordner mit dem Namen TwelveMonkeys
in Ihrem aktuellen Verzeichnis erstellt werden. Wechseln Sie in das Verzeichnis TwelveMonkeys
und geben Sie zum Erstellen den folgenden Befehl ein.
Erstellen Sie das Projekt (mit Maven):
$ mvn package
Derzeit ist das empfohlene JDK zum Erstellen eines Builds Oracle JDK 8.x.
Es ist möglich, mit OpenJDK zu erstellen, einige Tests können jedoch aufgrund geringfügiger Unterschiede zwischen den verwendeten Farbmanagementsystemen fehlschlagen. Sie müssen entweder die betreffenden Tests deaktivieren oder ganz ohne Tests erstellen.
Da die Komponententests ziemlich viel Speicher zum Ausführen benötigen, müssen Sie möglicherweise die Umgebungsvariable MAVEN_OPTS
festlegen, um dem Java-Prozess, der Maven ausführt, mehr Speicher zu geben. Ich schlage etwas wie -Xmx512m -XX:MaxPermSize=256m
vor.
Optional können Sie das Projekt in Ihrem lokalen Maven-Repository installieren, indem Sie Folgendes verwenden:
$ mvn install
Um die Plug-Ins zu installieren, verwenden Sie entweder Maven und fügen Sie die erforderlichen Abhängigkeiten zu Ihrem Projekt hinzu oder fügen Sie die erforderlichen JARs zusammen mit den erforderlichen Abhängigkeiten manuell im Klassenpfad hinzu.
Die ImageIO-Registrierung und der Dienstsuchmechanismus stellen sicher, dass die Plugins zur Verwendung verfügbar sind.
Um zu überprüfen, ob das JPEG-Plugin zur Laufzeit installiert und verwendet wird, können Sie den folgenden Code verwenden:
Iterator < ImageReader > readers = ImageIO . getImageReadersByFormatName ( "JPEG" );
while ( readers . hasNext ()) {
System . out . println ( "reader: " + readers . next ());
}
Die erste Zeile sollte lauten:
reader: com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader@somehash
Um mit Maven auf das JPEG- und TIFF-Plugin angewiesen zu sein, fügen Sie Ihrem POM Folgendes hinzu:
...
< dependencies >
...
< dependency >
< groupId >com.twelvemonkeys.imageio</ groupId >
< artifactId >imageio-jpeg</ artifactId >
< version >3.12.0</ version >
</ dependency >
< dependency >
< groupId >com.twelvemonkeys.imageio</ groupId >
< artifactId >imageio-tiff</ artifactId >
< version >3.12.0</ version >
</ dependency >
<!--
Optional dependency. Needed only if you deploy ImageIO plugins as part of a web app.
Make sure you add the IIOProviderContextListener to your web.xml, see above.
-->
< dependency >
< groupId >com.twelvemonkeys.servlet</ groupId >
< artifactId >servlet</ artifactId >
< version >3.12.0</ version >
</ dependency >
<!--
Or Jakarta version, for Servlet API 5.0
-->
< dependency >
< groupId >com.twelvemonkeys.servlet</ groupId >
< artifactId >servlet</ artifactId >
< version >3.12.0</ version >
< classifier >jakarta</ classifier >
</ dependency >
</ dependencies >
Um auf das JPEG- und TIFF-Plugin in Ihrer IDE oder Ihrem Programm angewiesen zu sein, fügen Sie alle folgenden JARs zu Ihrem Klassenpfad hinzu:
twelvemonkeys-common-lang-3.12.0.jar
twelvemonkeys-common-io-3.12.0.jar
twelvemonkeys-common-image-3.12.0.jar
twelvemonkeys-imageio-core-3.12.0.jar
twelvemonkeys-imageio-metadata-3.12.0.jar
twelvemonkeys-imageio-jpeg-3.12.0.jar
twelvemonkeys-imageio-tiff-3.12.0.jar
Da die ImageIO
-Plugin-Registrierung (die IIORegistry
) „VM-global“ ist, funktioniert sie mit Servlet-Kontexten in ihrer jetzigen Form nicht gut. Dies wird besonders deutlich, wenn Sie Plugins aus dem WEB-INF/lib
oder classes
Ordner laden. Sofern Sie ImageIO.scanForPlugins()
nicht irgendwo in Ihrem Code hinzufügen, sind die Plugins möglicherweise nie verfügbar.
Darüber hinaus laden und entladen Servlet-Kontexte Klassen dynamisch (unter Verwendung eines neuen Klassenladers pro Kontext). Wenn Sie Ihre Anwendung neu starten, bleiben alte Klassen standardmäßig für immer im Speicher (da es sich beim nächsten Aufruf scanForPlugins
um einen anderen ClassLoader
handelt, der Klassen scannt/lädt, und sie daher neue Instanzen in der Registrierung sind). Wenn ein Leseversuch mit einem der verbleibenden „alten“ Lesegeräte versucht wird, können seltsame Ausnahmen auftreten (wie NullPointerException
s beim Zugriff auf static final
initialisierte Felder oder NoClassDefFoundError
s für nicht initialisierte innere Klassen).
Um sowohl das Erkennungsproblem als auch das Ressourcenleck zu umgehen, wird dringend empfohlen, den IIOProviderContextListener
zu verwenden, der das dynamische Laden und Entladen von ImageIO-Plugins für Webanwendungen implementiert.
< web-app ...>
...
< listener >
< display-name >ImageIO service provider loader/unloader</ display-name >
< listener-class >com.twelvemonkeys.servlet.image.IIOProviderContextListener</ listener-class >
</ listener >
...
</ web-app >
Das Laden von Plugins aus WEB-INF/lib
ohne installierten Kontext-Listener wird nicht unterstützt und funktioniert nicht ordnungsgemäß.
Der Kontext-Listener hat keine Abhängigkeiten zu den TwelveMonkeys ImageIO-Plugins und kann auch mit JAI ImageIO oder anderen ImageIO-Plugins verwendet werden.
Eine weitere sichere Option besteht darin, die JAR-Dateien im freigegebenen oder gemeinsamen lib-Ordner des Anwendungsservers abzulegen.
Für diejenigen, die vom alten javax.servlet
zum neuen jakarta.servlet
-Paket wechseln, steht eine separate Abhängigkeit zur Verfügung. Es enthält genau die gleichen Servlet-Klassen wie oben erwähnt, basiert jedoch auf den neuen Jakarta EE-Paketen. Die Abhängigkeit hat den gleichen Gruppennamen und die gleiche Kennung wie zuvor, aber angehängt ist ein jakarta
Klassifikator , um sie vom Nicht-Jakarta-Paket zu unterscheiden.
Sehen Sie sich das Maven-Abhängigkeitsbeispiel an, um zu erfahren, wie Sie es mit Maven aktivieren. Gradle oder andere Build-Tools bieten ähnliche Optionen.
Die empfohlene Art, die Plugins zu verwenden, besteht einfach darin, die JARs unverändert in Ihr Projekt einzubinden, über eine Maven-Abhängigkeit oder ähnliches. Für die Verwendung der Bibliothek ist ein erneutes Verpacken nicht erforderlich und wird nicht empfohlen.
Wenn Sie jedoch ein „dickes“ JAR erstellen oder die JARs aus irgendeinem Grund aus irgendeinem Grund neu verpacken möchten, ist es wichtig zu bedenken, dass die automatische Erkennung der Plugins durch ImageIO vom Service Provider Interface (SPI)-Mechanismus abhängt. Kurz gesagt, jede JAR enthält einen speziellen Ordner mit dem Namen META-INF/services
, der eine oder mehrere Dateien enthält, typischerweise javax.imageio.spi.ImageReaderSpi
und javax.imageio.spi.ImageWriterSpi
. Diese Dateien sind in jeder JAR-Datei mit demselben Namen vorhanden. Wenn Sie also einfach alles in einen einzelnen Ordner entpacken oder eine JAR-Datei erstellen, werden die Dateien überschrieben und das Verhalten ist nicht spezifiziert (höchstwahrscheinlich wird am Ende nur ein einziges Plugin installiert).
Die Lösung besteht darin, sicherzustellen, dass alle Dateien mit demselben Namen zu einer einzigen Datei zusammengeführt werden, die alle SPI-Informationen jedes Typs enthält. Wenn Sie das Maven Shade-Plugin verwenden, sollten Sie den ServicesResourceTransformer verwenden, um diese Dateien ordnungsgemäß zusammenzuführen. Möglicherweise möchten Sie auch ManifestResourceTransforme verwenden, um den richtigen Herstellernamen, Versionsinformationen usw. zu erhalten. Andere „fette“ JAR-Bundler verfügen wahrscheinlich über ähnliche Mechanismen, um Einträge mit demselben Namen zusammenzuführen.
Die neueste Version, die unter Java 7 läuft, ist 3.9.4. Spätere Versionen erfordern Java 8 oder höher.
Häufige Abhängigkeiten
ImageIO-Abhängigkeiten
ImageIO-Plugins
ImageIO-Plugins erfordern Bibliotheken von Drittanbietern
Photoshop Path-Unterstützung für ImageIO
Servlet-Unterstützung
Dieses Projekt wird unter der von OSI genehmigten BSD-Lizenz bereitgestellt:
Copyright (c) 2008-2022, Harald Kuhr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
o Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
o Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
o Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
F: Wie verwende ich es?
a: Der einfachste Weg besteht darin, Ihr eigenes Projekt mit Maven, Gradle oder einem anderen Build-Tool mit Abhängigkeitsverwaltung zu erstellen und einfach Abhängigkeiten zu den spezifischen Plug-Ins hinzuzufügen, die Sie benötigen. Wenn Sie ein solches Build-Tool nicht verwenden, stellen Sie sicher, dass Sie alle erforderlichen JARs im Klassenpfad haben. Siehe den Abschnitt „Installieren“ oben.
F: Welche Änderungen muss ich an meinem Code vornehmen, um die Plug-Ins verwenden zu können?
a: Die kurze Antwort lautet: Keine. Für die grundlegende Verwendung, wie ImageIO.read(...)
oder ImageIO.getImageReaders(...)
, müssen Sie Ihren Code nicht ändern. Der Großteil der Funktionalität ist über Standard-ImageIO-APIs verfügbar, und es wurde große Sorgfalt darauf verwendet, keine zusätzlichen APIs einzuführen, wenn keine erforderlich sind.
Wenn Sie sehr spezifische/erweiterte Funktionen einiger Formate nutzen möchten, müssen Sie möglicherweise bestimmte APIs verwenden, z. B. das Festlegen der Basis-URL für ein SVG-Bild, das aus mehreren Dateien besteht, oder das Steuern der Ausgabekomprimierung einer TIFF-Datei.
F: Wie funktioniert es?
a: Das TwelveMonkeys ImageIO-Projekt enthält Plug-Ins für ImageIO. ImageIO verwendet einen Dienstsuchmechanismus, um Plug-Ins zur Laufzeit zu erkennen.
Sie müssen lediglich sicherstellen, dass sich die TwelveMonkeys ImageIO-JARs in Ihrem Klassenpfad befinden.
Weitere Informationen zur Registrierung und zum Suchmechanismus finden Sie im IIORegistry-API-Dokument.
Das Kleingedruckte: Der TwelveMonkeys-Dienstanbieter für JPEG, BMP und TIFF überschreibt die onRegistration-Methode und nutzt den paarweisen Teilreihenfolgemechanismus der IIOServiceRegistry
, um sicherzustellen, dass er vor dem von Sun/Oracle bereitgestellten JPEGImageReader
, BMPImageReader
TIFFImageReader
und Apple installiert wird bereitgestellter TIFFImageReader
unter OS X. Durch die Verwendung der paarweisen Reihenfolge werden keine Funktionen aus diesen Implementierungen entfernt, aber in den meisten Fällen werden Sie stattdessen die TwelveMonkeys-Plug-Ins verwenden.
F: Warum werden gängige Formate wie GIF oder PNG nicht unterstützt?
a: Die kurze Antwort lautet einfach, dass die in ImageIO integrierte Unterstützung für diese Formate in ihrem jetzigen Zustand als gut genug angesehen wird. Wenn Sie nach einer besseren PNG-Schreibleistung unter Java 7 und 8 suchen, sehen Sie sich den JDK9 PNG Writer Backport an.
F: Wann erscheint die nächste Veröffentlichung? Wie sieht der aktuelle Veröffentlichungsplan aus?
a: Das Ziel besteht darin, monatliche Veröffentlichungen zu veröffentlichen, die Fehlerbehebungen und kleinere neue Funktionen enthalten. Und vierteljährliche Veröffentlichungen mit mehr „wichtigen“ Funktionen.
F: Ich liebe dieses Projekt! Wie kann ich helfen?
a: Schauen Sie sich die offenen Probleme an und prüfen Sie, ob es Probleme gibt, bei deren Behebung Sie helfen können, oder stellen Sie eine Beispieldatei bereit oder erstellen Sie Testfälle. Es ist für Sie oder Ihre Organisation auch möglich, über GitHub Sponsors Sponsor zu werden. Durch die Bereitstellung von Finanzmitteln können wir mehr Zeit für die Behebung von Fehlern und die Implementierung neuer Funktionen aufwenden.
F: Was ist mit JAI? Einige der Formate werden bereits von JAI unterstützt.
a: Während JAI (und insbesondere jai-imageio) einige der gleichen Formate unterstützen, gibt es bei JAI einige große Probleme. Das offensichtlichste ist:
F: Was ist mit JMagick oder IM4Java? Kann man nicht einfach das verwenden, was bereits vorhanden ist?
a: Während großartige Bibliotheken eine breite Palette an Formaten unterstützen, haben die ImageMagick-basierten Bibliotheken im Vergleich zu ImageIO einige Nachteile.
Wir haben es geschafft