# BufferedImage resize



## DirtyData (3. Jul 2018)

Hallo ich versuche gerade ein bild zu skalieren dafür muss ich die AffineTransformOp benutzen allerdings spuckt mein Code bei mir eine exeption aus

Hier ist mal meine Methode um bilder zu skalieren:

```
private BufferedImage resizeImage(final BufferedImage originalImage, final int width, final int height) {
        final AffineTransform af = new AffineTransform();
        af.scale(width / originalImage.getWidth(), height / originalImage.getHeight());
        final AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_BILINEAR);
      
        BufferedImage rescaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        rescaledImage = operation.filter(originalImage, rescaledImage);

        return rescaledImage;
    }
```

Getestet habe ich das ganze mit dem bild: "https://pbs.twimg.com/profile_images/875633505861984257/YgXXj6oF.jpg"

dabei bekomme ich aber den fehler:

```
java.awt.image.ImagingOpException: Unable to invert transform AffineTransform[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
    at java.awt.image.AffineTransformOp.validateTransform(Unknown Source)
    at java.awt.image.AffineTransformOp.<init>(Unknown Source)
```

weiß vielleicht jemand warum ich den Fehler überhaupt bekomme?


----------



## VfL_Freak (3. Jul 2018)

Moin,

vlt. hilft Dir dies weiter:
https://coderanch.com/t/382350/java/AffineTransform

VG Klaus


----------



## Enceladus271 (3. Jul 2018)

DirtyData hat gesagt.:


> af.scale(width / originalImage.getWidth(), height / originalImage.getHeight());


width und originalImage.getWidth() liefern dir beide int Werte. width / originalImage.getWidth() kann dann schnell mal 0 werden. Versuchs mal so:
af.scale((double)width / originalImage.getWidth(), (double)height / originalImage.getHeight());


----------



## DirtyData (4. Jul 2018)

VfL_Freak


Enceladus271 hat gesagt.:


> width und originalImage.getWidth() liefern dir beide int Versuchs mal so:
> af.scale((double)width / originalImage.getWidth(), (double)height / originalImage.getHeight());


ok ich habe es getestet aber nun bekomme ich einen anderen fehler:

```
java.lang.NegativeArraySizeException
    at java.awt.image.DataBufferInt.<init>(Unknown Source)
    at java.awt.image.Raster.createPackedRaster(Unknown Source)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    at de.dirty.util.ImageStand.resizeImage(ImageStand.java:79)
```
ich habe versuch hier:
	
	
	
	





```
BufferedImage rescaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
```
width & height auch zu einen double zu casten das geht aber nicht.


----------



## VfL_Freak (4. Jul 2018)

Moin,
hier tritt der Fehler auf (DIESE Exception habe ich übrigens noch nie gehabt!):


DirtyData hat gesagt.:


> at de.dirty.util.ImageStand.resizeImage(ImageStand.java:79)



Ist das denn die von dir gepostete Zeile??



DirtyData hat gesagt.:


> width & height auch zu einen double zu casten das geht aber nicht


Natürlich nicht!!
Dein *BufferedImage* will _int _haben:
https://docs.oracle.com/javase/8/docs/api/index.html?java/awt/image/class-use/BufferedImage.html

VG Klaus


----------



## DirtyData (4. Jul 2018)

VfL_Freak hat gesagt.:


> Ist das denn die von dir gepostete Zeile??/QUOTE]
> Das ist diese hier;
> 
> ```
> ...


----------



## VfL_Freak (4. Jul 2018)

ja, schön ... und was soll einem das sagen ??? 
Wie sehen die Inhalte von _width _und _height _aus, wenn der Fehler kommt ???
Sollen wir das raten??

Auf jeden versuchst Du da ein Array mit *negativer *Größe zu erzeugen, was natürlich nicht gehen kann !!!


----------



## DirtyData (4. Jul 2018)

ok hier der ganze code:

```
BufferedImage image = ImageIO.read(new URL(https://pbs.twimg.com/profile_images/875633505861984257/YgXXj6oF.jpg"));
final double ratio = image.getHeight() / image.getWidth();

final BufferedImage resized = this.resizeImage(image, (int)(height / ratio), height);


    private BufferedImage resizeImage(final BufferedImage originalImage, final int width, final int height) {
        final AffineTransform af = new AffineTransform();
        af.scale((double)width / originalImage.getWidth(), (double)height / originalImage.getHeight());
        final AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_BILINEAR);
      
        double w = (double)width;
        double h = (double)height;
      
        BufferedImage rescaledImage = new BufferedImage((int)w, (int)h, BufferedImage.TYPE_INT_ARGB);
        rescaledImage = operation.filter(originalImage, rescaledImage);

        return rescaledImage;
    }
```


----------



## mihe7 (4. Jul 2018)

LOL - ich wünsche @VfL_Freak weiterhin viel Spaß beim Raten, was denn nun width und height ist...

@DirtyData das Casten von int zu double und anschließend wieder zurück zu int deutet aber schon auf pure Verzweiflung hin, oder? 

Wenn Du keinen Debugger verwenden willst, dann bau ganz oben in resizeImage wenigstens mal ein `System.err.println(width + " " + height);` ein und schau mal nach, was die Konsole sagt.


----------



## VfL_Freak (5. Jul 2018)

mihe7 hat gesagt.:


> LOL - ich wünsche @VfL_Freak weiterhin viel Spaß beim Raten, was denn nun width und height ist...


Danke danke  
Meine Frage war auch nicht, "... was denn nun width und height ist ..:", sondern welche konkreten Werte sie haben, wenn der Fehler auftritt.
Wenn dort double drinsteht, ist doch klar, das der Konstruktor meckert 

Aber wie Du schon richtig sagst:


mihe7 hat gesagt.:


> das Casten von int zu double und anschließend wieder zurück zu int deutet aber schon auf pure Verzweiflung hin, oder?



An die Methode werden doch Integer übergeben ... warum nutzt Du sie dann nicht, sondern castest wie wild in der Weltgeschichte herum ???

VG Klaus


----------



## mihe7 (5. Jul 2018)

VfL_Freak hat gesagt.:


> Meine Frage war auch nicht, "... was denn nun width und height ist ..:", sondern welche konkreten Werte sie haben, wenn der Fehler auftritt.


Ja, auf diese Frage war das auch bezogen. Manche Threads sind echt lustig:

F: Wie sehen die Werte von width und height im Fehlerfall aus?
A: alles mögliche an Code, der dann auch height enthält. Nicht erkennbar: Deklaration von height, Initialisierung von height. Und konkrete Werte gibt's sowieso nicht.


----------



## DirtyData (5. Jul 2018)

achso beim sysout kommt 100x100 raus


----------



## mihe7 (5. Jul 2018)

Mit dem Bild aus der URL und 100x100 läuft Dein Code einwandfrei durch.

Hier zum Testen:


```
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageIO;

public class Test {

    private final static String location =
            "https://pbs.twimg.com/profile_images/" +
            "875633505861984257/YgXXj6oF.jpg";

    public static void main(String[] args) throws Exception {
        int height = 100;

        BufferedImage image = ImageIO.read(new URL(location));
        final double ratio = image.getHeight() / image.getWidth();
        final BufferedImage resized = resizeImage(image,
                (int)(height / ratio), height);
        ImageIO.write(image, "JPG", new File("original.jpg"));
        ImageIO.write(resized, "JPG", new File("resized.jpg"));
    }

    private static BufferedImage resizeImage(
            final BufferedImage originalImage,
            final int width,
            final int height) {
        final AffineTransform af = new AffineTransform();
        af.scale((double)width / originalImage.getWidth(),
                 (double)height / originalImage.getHeight());
        final AffineTransformOp operation = new AffineTransformOp(
                af, AffineTransformOp.TYPE_BILINEAR);

        BufferedImage rescaledImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        rescaledImage = operation.filter(originalImage, rescaledImage);

        return rescaledImage;
    }
}
```


----------



## DirtyData (5. Jul 2018)

Beim Sysout kommt das raus : width= 100 height= 100


----------



## mihe7 (5. Jul 2018)

Lief der Testcode durch?


----------



## DirtyData (6. Jul 2018)

mihe7 hat gesagt.:


> Lief der Testcode durch?


ja aber das Bild verändert die Farbe bei mir


----------



## thecain (6. Jul 2018)

Ja, dann den Parameter anpassen beim buffered image


----------

