Was ist die beste Java-Bildverarbeitungsbibliothek / der beste Ansatz? [geschlossen]

244

Ich verwende sowohl die JAI Media API als auch ImageMagick?

ImageMagick weist einige Skalierbarkeitsprobleme auf, und das JNI-basierte JMagick ist ebenfalls nicht attraktiv. JAI hat im Vergleich zu ImageMagick schlechte Ergebnisse bei der Größenänderung.

Kennt jemand exzellente Open Source- oder kommerzielle Tools, die natives Java sind und qualitativ hochwertige Ergebnisse liefern?

Daniel Honig
quelle
5
JMagick hat fast keine Dokumentation außer den Javadocs. Ich habe gerade zwei Stunden damit verbracht, nach etwas zu suchen, das ziemlich einfach zu tun sein sollte.
Alex Ciminian
Tatsächlich. Ich habe mich dafür entschieden, den Prozess einfach zu verlassen und ImageMagick mit Apache Exec als Mittel zur Verwaltung des Prozesses zu verwenden. Das hat gut funktioniert. Ich könnte sogar so weit gegangen sein, einen Image-Server nur für diesen Zweck zu bauen. Mit der Qualität und Funktionalität von ImageMagick ist es schwierig, etwas zu finden.
Daniel Honig
158
Es ist lächerlich, dass Fragen wie diese als nicht zum Thema gehörend geschlossen werden. Über 100000 Aufrufe ist eindeutig eine Frage, die sich die Leute stellen. Manchmal wissen die Leute nicht genau alles, was sie im Voraus tun werden, und würden es begrüßen, wenn andere Leute "meinungsgebundene" Antworten auf den besten allgemeinen Rahmen geben würden. Zu viel grandiose Moderation auf SO!
user467257
12
Was ist falsch, wenn Leute Vor- und Nachteile von Wegen eines Schlüsselaspekts der Java-Programmierung diskutieren? Ist das nicht was SO tun soll? Meiner Meinung nach sollten solche Fragen sorgfältig moderiert und gepflegt werden, um Entwicklern, die mit dem jeweiligen Thema neu beginnen, einen guten Hinweis zu geben.
Raúl
20
Jep. Top Ergebnis in Google für java image processing libraryaber geschlossen ... wie gewohnt. Die Moderation geht heutzutage auf SO über Bord.
Stijn de Witt

Antworten:

88

Es gibt ImageJ , das sich rühmt, das zu sein

weltweit schnellstes reines Java-Bildverarbeitungsprogramm

Es kann als Bibliothek in einer anderen Anwendung verwendet werden. Die Architektur ist nicht brillant, erledigt aber grundlegende Bildverarbeitungsaufgaben.

Ivan
quelle
2
Ich verwende ImageJ als Bibliothek in einer Reihe von Bildverarbeitungsanwendungen. Es ist eine sehr anständige Java-Bibliothek. Es lässt sich auch gut in Java2D integrieren, sodass Sie die beiden ganz einfach mischen und anpassen können.
Hohonuuli
3
Zu der Zeit, als ich ImageJ verwendete, war die API ziemlich umständlich. Es ist eher eine Anwendung, für die Sie Plugins schreiben können, als eine Bibliothek. Und soweit ich mich erinnere, war der Versuch, eine neue GUI in dieser alten AWT-Codebasis zu entwickeln, ein Schmerz.
Ivan
4
Ich habe nur einen halben Tag damit verbracht, eine einfache Bildrotation, Skalierung und Beschneidung durchzuführen. Es ist 2019 und die Dokumentation von ImageJ kann nicht verwendet werden.
M. Leonhard
133

Ich weiß, dass diese Frage ziemlich alt ist, aber wenn neue Software herauskommt, hilft es, neue Links zu Projekten zu erhalten, die für Leute interessant sein könnten.

imgscalr ist eine reine Java-Bildgrößenänderungsbibliothek (und einfache Operationen wie Auffüllen, Zuschneiden, Drehen, Aufhellen / Dimmen usw.), die schmerzlich einfach zu verwenden ist - eine einzelne Klasse besteht aus einer Reihe einfacher Grafikoperationen, die alle als statische Methoden definiert sind Sie übergeben ein Bild und erhalten ein Ergebnis zurück.

Das grundlegendste Beispiel für die Verwendung der Bibliothek sieht folgendermaßen aus:

BufferedImage thumbnail = Scalr.resize(image, 150);

Eine typischere Verwendung zum Generieren von Bildminiaturen mit ein paar Qualitätsverbesserungen und dergleichen könnte folgendermaßen aussehen:

import static org.imgscalr.Scalr.*;

public static BufferedImage createThumbnail(BufferedImage img) {
    // Create quickly, then smooth and brighten it.
    img = resize(img, Method.SPEED, 125, OP_ANTIALIAS, OP_BRIGHTER);

    // Let's add a little border before we return result.
    return pad(img, 4);
}

Alle Bildverarbeitungsvorgänge verwenden die unformatierte Java2D-Pipeline (die auf wichtigen Plattformen hardwarebeschleunigt ist) und verursachen keine Probleme beim Aufrufen über JNI wie Bibliothekskonflikte in Ihrem Code.

imgscalr wurde an vielen Stellen auch in großen Produktionen eingesetzt - die Einbeziehung der AsyncScalr-Klasse macht es zu einem perfekten Drop-In für jede serverseitige Bildverarbeitung.

Es gibt zahlreiche Verbesserungen an der Bildqualität, mit denen Sie zwischen Geschwindigkeit und Qualität wechseln können, wobei der höchste ULTRA_QUALITY-Modus ein skaliertes Ergebnis liefert, das besser aussieht als die Lancoz3-Implementierung von GIMP.

Riad Kalla
quelle
@ Riyad Kalla es scheint interessant, danke ... Aber ich verstehe nicht, kann es in kommerziellen Projekten verwendet werden?
user592704
2
@ user592704 Absolut, imgscalr ist unter der Apache 2-Lizenz lizenziert. die gleiche Lizenz alles unter der Apache Foundation ist unter lizenziert. Sie können es in Open Source- oder kommerziellen Produkten verwenden, was Sie wollen. imgscalr wird bereits in einer Reihe von kommerziellen Web-Apps in der Produktion eingesetzt.
Riyad Kalla
1
@DavidParks Sie haben Recht, imgscalr soll übernehmen, sobald Sie diese BufferedImage-Instanz (decodierte Bilddaten) haben, nicht vorher. Ich wollte nicht einmal in Betracht ziehen, meine eigenen Decoder / Encoder zu entwickeln, da diese Pipelines vom Java2D-Team längst unter dem Deckmantel der Hardware beschleunigt wurden - um all diese Fehler fehlerfrei und effizient zu wiederholen wäre ein herkulisches Unterfangen.
Riyad Kalla
1
@gstackoverflow imgscalr verarbeitet die rohen BufferedImage-Instanzen (decodierte Bilddaten). Daher muss etwas anderes (normalerweise die ImageIO-Bibliothek) die codierten Bilddaten in ein BufferedImage dekodieren und sie dann nach dem Betrieb von imgscalr in ein neues Bild umcodieren anders ausgedrückt: "imgscalr kümmert sich nicht um das Dateiformat, Sie haben das Bild bereits dekodiert, bevor Sie es an imgscalr übergeben"
Riyad Kalla
1
ImgScalr eignet sich nur für grundlegende Bildmanipulationen. Wenn es um das Laden und Verarbeiten von Bildern geht. es fehlt die Komplexität.
MarekM
31

Eine weitere gute Alternative: Marvin

Joseph
quelle
9
Vielen Dank. Du hast meinen Tag gerettet! : D (PS: Ich bin nicht der OP. Ich bin beim Googeln auf diesen Beitrag gestoßen und vertraue mir, er hat mir sehr geholfen! (Ich werde dir ein Bier kaufen, wenn ich dich eines Tages treffe.)).
fehlender Faktor
3
@missingfaktor jetzt schulde ich dir ein bier Ihr Lob an Joseph hat mir auch den Tag gerettet. Joseph, du bekommst auch ein Bier :)!
Filip Dupanović
3
Diese URL existiert anscheinend nicht mehr, aber marvinproject.sourceforge.net scheint die neue URL zu sein.
Amos M. Carpenter
Okay, ich bin irgendwie verpflichtet, DIESEM einen Blick zu geben. =)
Marvo
Sieht wirklich gut aus, werde es versuchen.
Ridcully
8

Die Verarbeitung ist neu, aber sehr, sehr gut.

fmsf
quelle
1
Ich bin mir der Verarbeitung bewusst, aber verwenden die Leute sie wirklich in der, ich möchte X-Transformation für meine Bibliothek von X JPEGs Mode ausführen?
Daniel Honig
Ich habe es benutzt und scheint wirklich mächtig und es lohnt sich zu wetten
fmsf
2
Tatsächlich sind die Kernbibliotheken (die zum Einbetten von Funktionen verwendet werden könnten) LGPL. Aber niemand hat gefragt, was die Lizenz ist. wiki.processing.org/w/…
Benjamin Atkin
5

Versuchen Sie, Catalano Framework zu verwenden .

Schlüsselpunkte:

  • Architektur wie AForge.NET/Accord.NET.
  • Führen Sie in beiden Umgebungen denselben Code, denselben Desktop und denselben Android aus.
  • Enthält mehrere Filter parallel.
  • Die Entwicklung läuft auf Hochtouren.

Das Catalano Framework ist ein Framework für wissenschaftliches Rechnen für Java und Android. Das Projekt begann als erste Portierung der vielen Funktionen der AForge.NET- und Accord.NET-Frameworks für .NET, wächst jedoch stetig mit erweiterten Funktionen, die jetzt von diesen Projekten gemeinsam genutzt werden.

Beispiel:

FastBitmap fb = new FastBitmap(bitmap);

Grayscale g = new Grayscale();
g.applyInPlace(fb);

Threshold t = new Threshold(120);
t.applyInPlace(fb);

bitmap = fb.toBitmap();

//Show the result
Diego Catalano
quelle
6
The best framework in Java is Catalano Frameworkdas klingt so, als würden Sie Ihr eigenes Produkt bewerben. Ihr Framework mag großartig sein, aber Sie sollten Ihre Zugehörigkeit dazu offenlegen, wie in den FAQs angegeben .
Matthias Braun
@MatthiasBraun OK, ich stimme dir zu, ich wusste nichts davon. Ich habe die Antwort bearbeitet.
Diego Catalano
1
Das Catalano Framework wurde
19:22 Uhr
4

Imo ist der beste Ansatz die Verwendung des GraphicsMagick-Bildverarbeitungssystems mit im4java als Befehlszeilenschnittstelle für Java.

GraphicsMagick bietet viele Vorteile, aber einen für alle:

  • GM wird verwendet, um Milliarden von Dateien auf den weltweit größten Fotoseiten (z. B. Flickr und Etsy) zu verarbeiten.
Kajo
quelle
Es ist nur ein Befehlszeilen-Wrapper - keine Bibliothek ...
Kulpemovitz
3

http://im4java.sourceforge.net/ - Wenn Sie Linux verwenden, ist das Forken eines neuen Prozesses nicht teuer.

Amanjit Gill
quelle
Achten Sie jedoch auf Speicherfehler ...
Claes Mogren
Gabeln ist teuer. Es kann viel Speicher verbrauchen. Siehe das Zitat der Person aus einem Artikel am Ende von coderanch.com/t/419196/java/java/there-any-way-execute-Linux (Der Artikel lautet: developer.sun.com/solaris/articles/subprocess/subprocess .html )
Plaudit Design
@Plaudit checkout gm4java, es erstellt einen Pool von GM-Prozessen im interaktiven Modus und muss nicht jedes Mal gegabelt werden, um ein Bild zu konvertieren. kennethxu.blogspot.com/2013/04/…
Kenneth Xu
2

Für kommerzielle Tools möchten Sie möglicherweise Snowbound ausprobieren.

http://www.snowbound.com/

Meine Erfahrung mit ihnen ist etwas veraltet, aber ich fand, dass ihre Java Imaging-API viel einfacher zu verwenden als JAI und viel schneller ist.

Der Kundensupport und die Codebeispiele waren ebenfalls sehr gut.

Clayton
quelle
2

RoboRealm Vision Software Liste erwähnt JHLabs und NeatVision unter vielen anderen Nicht-Java - basierten Bibliotheken.

rics
quelle
1

Ich kann nicht sagen, dass es die "beste" Bibliothek ist, aber ich denke, Sie können dies versuchen: http://algart.net/java/AlgART/ Es ist eine Open-Source-Java-Bibliothek, die verallgemeinerte "intelligente" Arrays und Matrizen unterstützt Elemente verschiedener Typen (von 1-Bit- bis 64-Bit-Gleitkomma), einschließlich 2D-, 3D- und mehrdimensionaler Bildverarbeitung und anderer Algorithmen, die mit Arrays und Matrizen arbeiten. Leider besteht es momentan nicht aus genügend Demos und Beispielen, aber andererseits enthält es viele JavaDocs. Es lag mehrere Jahre lang auf der Basis kommerzieller Software (SIMAGIS), ist aber jetzt Open Source.

Daniel
quelle
2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Matthias
Sie haben Recht, ich habe den ersten Kommentar bearbeitet.
Daniel