Ich habe ein Bild von sagen Dimensionen 800x800, die eine Größe von 170 kb hat. Ich möchte dieses Bild verkleinern, um 600x600 zu sagen. Nach der Größenänderung möchte ich die Bildgröße reduzieren. Wie kann ich das machen?Bildgrößenanpassung in Java, um die Bildgröße zu reduzieren
Antwort
Sie benötigen keine vollständige Bildverarbeitungsbibliothek zum einfachen Ändern der Größe eines Bildes.
Der empfohlene Ansatz ist durch progressive bilinear mit Skalierung, wie so (fühlen Sie sich frei, diese Methode zu verwenden, wie in Ihrem Code ist):
public BufferedImage scale(BufferedImage img, int targetWidth, int targetHeight) {
int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage ret = img;
BufferedImage scratchImage = null;
Graphics2D g2 = null;
int w = img.getWidth();
int h = img.getHeight();
int prevW = w;
int prevH = h;
do {
if (w > targetWidth) {
w /= 2;
w = (w < targetWidth) ? targetWidth : w;
}
if (h > targetHeight) {
h /= 2;
h = (h < targetHeight) ? targetHeight : h;
}
if (scratchImage == null) {
scratchImage = new BufferedImage(w, h, type);
g2 = scratchImage.createGraphics();
}
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(ret, 0, 0, w, h, 0, 0, prevW, prevH, null);
prevW = w;
prevH = h;
ret = scratchImage;
} while (w != targetWidth || h != targetHeight);
if (g2 != null) {
g2.dispose();
}
if (targetWidth != ret.getWidth() || targetHeight != ret.getHeight()) {
scratchImage = new BufferedImage(targetWidth, targetHeight, type);
g2 = scratchImage.createGraphics();
g2.drawImage(ret, 0, 0, null);
g2.dispose();
ret = scratchImage;
}
return ret;
}
-Code geändert und von der ursprünglichen bei Filthy Rich Clients gereinigt.
Basierend auf Ihren Kommentar, können Sie Qualität und kodieren JPEG Bytes wie so reduzieren:
image
die BufferedImage ist.
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.2f); // Change this, float between 0.0 and 1.0
writer.setOutput(ImageIO.createImageOutputStream(os));
writer.write(null, new IIOImage(image, null, null), param);
writer.dispose();
Jetzt, da os
ein ByteArrayOutputStream
ist, können Sie Base64 kodieren.
String base64 = Base64.encode(os.toByteArray());
Ich möchte die Bildgröße (in Bytes) nach der Größenanpassung reduzieren, so dass ich es über einen Socket senden kann. Der Datenausgabestrom sagt, dass die codierte Zeichenfolge (Base64) zu groß ist. – Madeyedexter
Base64 codiert stattdessen JPEG-Bytes. Sie können 'ImageIO' dafür verwenden. – LanguagesNamedAfterCofee
@Danish Siehe meine Bearbeitung – LanguagesNamedAfterCofee
Verwenden Sie ein gutes Framework, das Bildverarbeitung über Java unterstützt, z. IamageJ
Es gibt auch einige grundlegende Unterstützung in Java durch einige Klassen wie MemoryImageSource und PixelGrabber.
Ich habe es überprüft. Ich möchte dies in meinem Java-Programm tun! – Madeyedexter
Ich aktualisierte die Antwort mit grundlegenden Support-Informationen in Core Java. Ich hoffe, das hilft. –
Sie können die 100% Java, Apache2 Open-Source-imgscalr library (eine einzelne statische Klasse) und etwas tun, wie folgt verwenden:
import org.imgscalr.Scalr.*; // static imports are awesome with the lib
... some class code ...
// This is a super-contrived method name, I just wanted to incorporate
// the details from your question accurately.
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, 600), "JPG", new File("/path/to/file.jpg"));
}
HINWEIS: Wenn das schaut oben ungerade, die statische Import ermöglicht es mir, die resize Anruf ohne Scalr.resize Angabe direkt zu verwenden (...)
Außerdem, wenn die Qualität der gut aussehen geschrieben skalierte Bild aus genug nicht (es schnell geschrieben werden aber) Sie mehr Argumente für die die Größe Methode, wie so verwenden können:
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600), "JPG", new File("/path/to/file.jpg"));
}
.. und Sie können sogar gilt eine BufferedImageOp zu dem Ergebnis, es zu erweichen incase der Downscaling des Bild Look macht Jaggy:
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600, Scalr.OP_ANTIALIAS), "JPG", new File("/path/to/file.jpg"));
}
Sie beginnen können nur um mit der Bibliothek spielen den folgenden dep Eintrag in Ihrem Maven POM (imgscalr in der Zugabe ist Maven Central Repo):
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
- 1. Bildgröße MB KB reduzieren java
- 2. Bildgröße in C reduzieren #
- 3. Bildgröße in der Produktansicht reduzieren
- 4. Bilder komprimieren, um die Dateigröße zu reduzieren
- 5. Bildgröße (Java)
- 6. Erstellen Sie ein Vorschaubild und reduzieren Sie die Bildgröße
- 7. Wie kann ich die Bildgröße im iPhone reduzieren?
- 8. FreeMarker-Layouts, um die Vorlagenredundanz zu reduzieren?
- 9. Wie benutzerdefinierte Büroklammer Prozessoren machen die Bildgröße, um die Größe
- 10. Entwurfsmuster, um die Kopplung in Swing-Anwendung zu reduzieren
- 11. CSS/JS Bildgröße anpassen, um Bildgröße anzupassen
- 12. Bildgrößenanpassung in React Native
- 13. Bildgröße ändern, um Bildansicht zu passen
- 14. Verwenden Sie ffmpeg, um die Bildgröße zu ändern
- 15. Gibt es eine Möglichkeit, die Genauigkeit zu reduzieren, um den Speicherverbrauch zu reduzieren?
- 16. Bildgröße in XCode anpassen?
- 17. Smaller auf die Bildgröße in JPanel
- 18. Android Reduzieren der Bildgröße vor dem Hochladen auf den Server
- 19. Benötigen Sie Hilfe im folgenden, um die Ausführungszeit zu reduzieren
- 20. Vorlagen: Verwenden Sie Vorwärtsdeklarationen, um die Kompilierzeit zu reduzieren?
- 21. Java kopflose bicubic Bildgröße ändern
- 22. Verwenden von pointinterval, um die Anzahl der Punkte zu reduzieren
- 23. Pass-Funktion, um doppelten Code zu reduzieren
- 24. Refactoring Laravel-Funktion, um die Anzahl der Datenbankabfragen zu reduzieren
- 25. Jeder Weg, um die Belastung auf Server zu reduzieren
- 26. Beschleunigung der Bildgrößenanpassung
- 27. Bildgrößenanpassung im Schieberegler
- 28. Bedingte Bildgrößenanpassung mit Carrierwave
- 29. Die Grammatik reformieren, um die Verschiebung zu entfernen den Konflikt in if-then-else zu reduzieren
- 30. Java Regex - Leerzeichen in einer Zeichenfolge zu reduzieren
Sie könnten einen Blick auf http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background-image/11959928#11959928 – MadProgrammer
1) * "Nach der Größenänderung möchte ich die zu reduzierende Bildgröße. "* Wenn im Speicher gehalten oder in PNG, JPG oder GIF serialisiert? Die erste führt zu einer Reduzierung der Bytes, die zweite wird oft nicht. 2) Welches Format hat das Bild? (PNG, GIF, JPEG ..) –
Wenn das Format JPEG ist, ist es höchstwahrscheinlich effektiver, die Bildbytegröße auf der Festplatte zu reduzieren, indem das Komprimierungsverhältnis erhöht wird. Siehe beispielsweise "ImageCompressionDemo" (http://stackoverflow.com/a/5998015/418556) als Quelle. –