Gepufferte Bildgröße ändern

Lesezeit: 6 Minuten

Benutzer-Avatar
Benutzer1060187

Ich versuche, die Größe eines gepufferten Bildes zu ändern. Ich kann es speichern und ohne Probleme auf einem Jframe anzeigen, aber ich kann die Größe anscheinend nicht ändern. Tipps, wie ich dies ändern kann, damit es funktioniert und das Bild als 200 * 200-Datei anzeigt, wären großartig

private void profPic(){
    String path = factory.getString("bottle");
    BufferedImage img = ImageIO.read(new File(path));
}


public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
    int w = img.getWidth();  
    int h = img.getHeight();  
    BufferedImage dimg = new BufferedImage(newW, newH, img.getType());  
    Graphics2D g = dimg.createGraphics();  
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);  
    g.dispose();  
    return dimg;  
}  

Benutzer-Avatar
Okrakoke

Aktualisierte Antwort

Ich kann mich nicht erinnern, warum meine ursprüngliche Antwort funktioniert hat, aber nachdem ich sie in einer separaten Umgebung getestet habe, stimme ich zu, dass die ursprünglich akzeptierte Antwort nicht funktioniert (warum ich das gesagt habe, kann ich mich auch nicht erinnern). Das hat dagegen funktioniert:

public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
    Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
    BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2d = dimg.createGraphics();
    g2d.drawImage(tmp, 0, 0, null);
    g2d.dispose();

    return dimg;
}  

  • Das kompiliert nicht – getScaledInstance gibt ein Bild zurück, kein BufferedImage.

    – I82Viel

    18. Februar 2013 um 2:46 Uhr

  • Immer noch nicht sicher – auf meinem Macbook bekomme ich zB eine ClassCastException – es ist keine garantierte Konvertierung.

    – I82Viel

    18. Februar 2013 um 17:08 Uhr

  • @I82Much Einmal schreiben, überall ausführen … Ähm.

    – TEK

    15. November 2013 um 15:45 Uhr

  • Warum wird dies als die richtige Antwort aufgeführt, wenn es nicht funktioniert?

    – Jeremy

    26. September 2014 um 19:41 Uhr

  • Wieso den TYPE_INT_ARGB und nicht img.getType()?

    – ADTC

    4. August 2015 um 4:19 Uhr

Benutzer-Avatar
coobird

Wenn nur die Größe von a geändert werden muss BufferedImage in dem resize Methode, dann die Miniaturbild Bibliothek kann das ziemlich einfach tun:

public static BufferedImage resize(BufferedImage img, int newW, int newH) {
  return Thumbnails.of(img).size(newW, newH).asBufferedImage();
}

Der obige Code ändert die Größe der img um die Abmessungen zu passen newW und newH unter Beibehaltung des Seitenverhältnisses des Originalbildes.

Wenn das Beibehalten des Seitenverhältnisses nicht erforderlich ist und eine Größenänderung auf genau die angegebenen Abmessungen erforderlich ist, dann ist die forceSize Methode kann anstelle von verwendet werden size Methode:

public static BufferedImage resize(BufferedImage img, int newW, int newH) {
  return Thumbnails.of(img).forceSize(newW, newH).asBufferedImage();
}

Verwendung der Image.getScaledInstance -Methode garantiert nicht, dass das Seitenverhältnis des Originalbilds für das in der Größe geänderte Bild beibehalten wird, und außerdem ist es im Allgemeinen sehr langsam.

Thumbnailator verwendet eine Technik, um die Größe des Bildes schrittweise zu ändern mehrmals schneller als Image.getScaledInstance bei gleichzeitiger Erzielung einer im Allgemeinen vergleichbaren Bildqualität.

Haftungsausschluss: Ich bin der Betreuer dieser Bibliothek.

  • Thumbnailer genial.!

    – Java Entwickler

    21. Januar 2016 um 8:52 Uhr

Hier ist ein Code, den ich verwendet habe, um die Größe von gepufferten Bildern zu ändern, ohne Schnickschnack, ziemlich schnell:

public static BufferedImage scale(BufferedImage src, int w, int h)
{
    BufferedImage img = 
            new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    int x, y;
    int ww = src.getWidth();
    int hh = src.getHeight();
    int[] ys = new int[h];
    for (y = 0; y < h; y++)
        ys[y] = y * hh / h;
    for (x = 0; x < w; x++) {
        int newX = x * ww / w;
        for (y = 0; y < h; y++) {
            int col = src.getRGB(newX, ys[y]);
            img.setRGB(x, y, col);
        }
    }
    return img;
}

  • tolle Methode, aber die Proportionen stimmten nicht, als ich den Faktor für die Höhe durch die Quadratwurzel aus zwei geteilt habe, hat es gut funktioniert.. =)

    – nyx00

    20. September 2019 um 13:18 Uhr


Benutzer-Avatar
Frizz1977

Diese Klasse ändert die Größe aus einer Datei und erhält den Formatnamen:

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream;
import org.apache.commons.io.IOUtils;

public class ImageResizer {

public static void main(String as[]) throws IOException{

    File f = new File("C:/Users/samsungrob/Desktop/shuttle.jpg");

    byte[] ba = resize(f, 600, 600);

    IOUtils.write(ba, new FileOutputStream( new File("C:/Users/samsungrob/Desktop/shuttle_resized.jpg") ) );

}




public static byte[] resize(File file,
                            int maxWidth, int maxHeight) throws IOException{
    int scaledWidth = 0, scaledHeight = 0;

    BufferedImage img = ImageIO.read((ImageInputStream) file );

    scaledWidth = maxWidth;
    scaledHeight = (int) (img.getHeight() * ( (double) scaledWidth / img.getWidth() ));

    if (scaledHeight> maxHeight) {
        scaledHeight = maxHeight;
        scaledWidth= (int) (img.getWidth() * ( (double) scaledHeight/ img.getHeight() ));

        if (scaledWidth > maxWidth) {
            scaledWidth = maxWidth;
            scaledHeight = maxHeight;
        }
    }

    Image resized =  img.getScaledInstance( scaledWidth, scaledHeight, Image.SCALE_SMOOTH);

    BufferedImage buffered = new BufferedImage(scaledWidth, scaledHeight, Image.SCALE_REPLICATE);

    buffered.getGraphics().drawImage(resized, 0, 0 , null);

    String formatName = getFormatName( file ) ;

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    ImageIO.write(buffered,
            formatName,
            out);

    return out.toByteArray();
}


private static String getFormatName(ImageInputStream iis) {
    try { 

        // Find all image readers that recognize the image format
        Iterator iter = ImageIO.getImageReaders(iis);
        if (!iter.hasNext()) {
            // No readers found
            return null;
        }

        // Use the first reader
        ImageReader reader = (ImageReader)iter.next();

        // Close stream
        iis.close();

        // Return the format name
        return reader.getFormatName();
    } catch (IOException e) {
    }

    return null;
}

private static String getFormatName(File file) throws IOException {
    return getFormatName( ImageIO.createImageInputStream(file) );
}

private static String getFormatName(InputStream is) throws IOException {
    return getFormatName( ImageIO.createImageInputStream(is) );
}

}

Dies ist eine verkürzte Version dessen, was tatsächlich in imgscalr passiert, wenn Sie nur die “ausgeglichene” Glättung verwenden möchten:

/**
 * Takes a BufferedImage and resizes it according to the provided targetSize
 *
 * @param src the source BufferedImage
 * @param targetSize maximum height (if portrait) or width (if landscape)
 * @return a resized version of the provided BufferedImage
 */
private BufferedImage resize(BufferedImage src, int targetSize) {
    if (targetSize <= 0) {
        return src; //this can't be resized
    }
    int targetWidth = targetSize;
    int targetHeight = targetSize;
    float ratio = ((float) src.getHeight() / (float) src.getWidth());
    if (ratio <= 1) { //square or landscape-oriented image
        targetHeight = (int) Math.ceil((float) targetWidth * ratio);
    } else { //portrait image
        targetWidth = Math.round((float) targetHeight / ratio);
    }
    BufferedImage bi = new BufferedImage(targetWidth, targetHeight, src.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = bi.createGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); //produces a balanced resizing (fast and decent quality)
    g2d.drawImage(src, 0, 0, targetWidth, targetHeight, null);
    g2d.dispose();
    return bi;
}

Probieren Sie die imgscalr-Bibliothek aus. Beste Bibliothek, die ich gefunden habe – sehr schnell, gute Qualität und einfach zu bedienen

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

veralteter Link: http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/

Apache 2-Lizenz

Benutzer-Avatar
Einfarbig

Schau mal, das hilft:

BufferedImage bImage = ImageIO.read(new File(C:\image.jpg);

BufferedImage thumbnail = Scalr.resize(bImage,  Scalr.Method.SPEED, Scalr.Mode.FIT_TO_WIDTH,
                                       750, 150, Scalr.OP_ANTIALIAS);

1014430cookie-checkGepufferte Bildgröße ändern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy