# bildskalierung zu langsam



## pornopizza (1. Mrz 2007)

Moinmoin,

habe ein kleines Javaprogramm geschrieben, das bilder mittels parameter übergeben bekommt und die dann in Bilder umwandelt die 1.2megapixel haben. Leider funktioniert es noch nicht, dass sie nach der Skalierung 1.2Megapixel haben. Die erste Frage also: Warum nicht?

Die 2. Frage, die mir eigentlich noch wichtiger ist:
das ganze läuft unfassbar langsam. Wofür normale Bildbearbeitungsprogramme keine Sekunde brauchen, das wird hier in etwa 20Sekunden erledigt. Warum dauert das so lange?! Oder besser: Wie geht es schneller?


```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

class imageResizer{
  public static void main(String[] args){
    
    for(int i=0;i<args.length;i++){
      try {
  			Image img = new ImageIcon(ImageIO.read(new File(args[i]))).getImage();
        int sizeX=img.getWidth(null);
        int sizeY=img.getHeight(null);
        int MegPix=sizeX*sizeY;
        double rel=1200000.0/(double)MegPix;
        int wNew=(int)(rel*sizeX);
        int hNew=(int)(rel*sizeY);
        
        System.out.println("Now scaling image...");  
  	Image scaledImage = img.getScaledInstance(wNew, hNew,	Image.SCALE_SMOOTH);
        System.out.println("  ...image scaled");
  
        System.out.println("Now buffering image...");  
        BufferedImage outImg = new BufferedImage(wNew, hNew, BufferedImage.TYPE_INT_RGB);
        System.out.println("  ...image buffered");
        
        System.out.println("Now getting image graphics...");  
  	Graphics g = outImg.getGraphics();
        System.out.println("  ...image graphics received");
        
        System.out.println("Now drawing image...");  
  	g.drawImage(scaledImage, 0, 0, null);
    	System.out.println("  ...image drawn");
        
        System.out.println("Now writing image...");
        ImageIO.write(outImg, "jpeg", new File("resz_"+args[i]));
        System.out.println("  ...image written");
        
        g.dispose();
  
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
    }
    System.exit(0);
  }
}
```

Freue mich auf Antworten,
Gruß
porno


----------



## André Uhres (3. Mrz 2007)

Hallo porno,

1. Deine Formel ist wohl falsch: 
das Verhältnis der beiden Flächen ist nicht gleich dem Verhältnis der beiden Breiten oder Höhen.

2. Bei mir läuft's in maximal 2 Sekunden: könntest du etwas mehr über dein Umfeld berichten?

Gruß,
André


----------



## pornopizza (3. Mrz 2007)

ups - ok, die formel ist quatsch, hast recht...

zum umfeld:
mein testbild hat folgende ausmaße:
2064x3096pix
und ist knapp 4mb groß

kleinere Bilder gehen recht schnell zu verkleinern, aber bei etwas größeren dauert das ganze einfach viiiiel zu lange.

zu meinem system:
Win Xp pro (SP2)
j2sdk1.4.2_02

amd a64 3500+,2gig ram

hier nochmal der neue Code:


```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

class imageResizer{
  public static void main(String[] args){
    double FP=1200000.0;
    
    for(int i=0;i<args.length;i++){
      try {
  			Image img = new ImageIcon(ImageIO.read(new File(args[i]))).getImage();
        double ox=(double)img.getWidth(null);
        double oy=(double)img.getHeight(null);
        double MP=ox*oy;
        double rel=FP/(double)MP;
        double rel_wh=Math.sqrt(rel);
        int nx=(int)(ox*rel_wh);
        int ny=(int)(oy*rel_wh);
        
        System.out.println("");
        System.out.println("----------------------- now resizing "+args[i]+" !-----------------------");
        System.out.println("");
        
        System.out.println("Debugginginfo:\n    "+
                           "ox: "+ox+"\n    "+
                           "oy: "+oy+"\n    "+
                           "MP: "+MP+"\n    "+
                           "FP: "+FP+"\n    "+
                           "rel: "+rel+"\n    "+
                           "rel_wh: "+rel_wh+"\n    "+
                           "nx: "+nx+"\n    "+
                           "ny: "+ny+"\n    ");        
        
        System.out.println("Now scaling image...");  
  			Image scaledImage = img.getScaledInstance(nx, ny,	Image.SCALE_SMOOTH);
        System.out.println("  ...image scaled");
  
        System.out.println("Now buffering image...");  
        BufferedImage outImg = new BufferedImage(nx, ny, BufferedImage.TYPE_INT_RGB);
        System.out.println("  ...image buffered");
        
        System.out.println("Now getting image graphics...");  
  			Graphics g = outImg.getGraphics();
        System.out.println("  ...image graphics received");
        
        System.out.println("Now drawing image...");  
  			g.drawImage(scaledImage, 0, 0, null);
    		System.out.println("  ...image drawn");
        
        System.out.println("Now writing image...");
        ImageIO.write(outImg, "jpeg", new File("resz_"+args[i]));
        System.out.println("  ...image written");
        
        g.dispose();
  
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
    }
    System.exit(0);
  }
}
```


gruß
porno


----------



## André Uhres (3. Mrz 2007)

Versuch's mal so:
Du machst kein scaledImage, und machst den drawImage so:

```
g.drawImage(img, 0, 0,  wNew, hNew, 0, 0, sizeX, sizeY, null);
```
Dann wird das Bild auch verkleinert, das müsste aber schneller gehen.


----------



## pornopizza (3. Mrz 2007)

wow kewl, funktioniert...geht ratz fatz und die qualität ist auch noch in ordnung.

danke mann=)

wenns wen interessiert, hier der ganze code:


```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

class imageResizer{
  public static void main(String[] args){
    double FP=1200000.0;
    
    for(int i=0;i<args.length;i++){
      try {
  			Image img = new ImageIcon(ImageIO.read(new File(args[i]))).getImage();
        double ox=(double)img.getWidth(null);
        double oy=(double)img.getHeight(null);
        double MP=ox*oy;
        double rel=FP/(double)MP;
        double rel_wh=Math.sqrt(rel);
        int nx=(int)(ox*rel_wh);
        int ny=(int)(oy*rel_wh);
        
        System.out.println("");
        System.out.println("----------------------- now resizing "+args[i]+" !-----------------------");
        System.out.println("");
        
        System.out.println("Debugginginfo:\n    "+
                           "ox: "+ox+"\n    "+
                           "oy: "+oy+"\n    "+
                           "MP: "+MP+"\n    "+
                           "FP: "+FP+"\n    "+
                           "rel: "+rel+"\n    "+
                           "rel_wh: "+rel_wh+"\n    "+
                           "nx: "+nx+"\n    "+
                           "ny: "+ny+"\n    ");
  
        System.out.println("Now buffering image...");  
        BufferedImage outImg = new BufferedImage(nx, ny, BufferedImage.TYPE_INT_RGB);
        System.out.println("  ...image buffered");
        
        System.out.println("Now getting image graphics...");  
  			Graphics g = outImg.getGraphics();
        System.out.println("  ...image graphics received");
        
        System.out.println("Now drawing image...");  
        g.drawImage(img, 0, 0,  nx, ny, 0, 0, (int)(ox), (int)(oy), null);
    		System.out.println("  ...image drawn");
        
        System.out.println("Now writing image...");
        ImageIO.write(outImg, "jpeg", new File("resz_"+args[i]));
        System.out.println("  ...image written");
        
        g.dispose();
  
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
    }
    System.exit(0);
  }
}
```


----------

