Du bist nicht angemeldet.

Werbeanzeige

1

30.12.2012, 01:04

ImageIO, Bilder mit geringerer Qualität laden

Halli Hallo :)

meine Frage ist kurz, ich lade Bilder mit dem Befehl :

C-/C++-Quelltext

1
image = getScaledImages(ImageIO.read(url));



getScaled skaliert das Bild einfach nur runter mit :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private BufferedImage getScaledImages(BufferedImage in) {
        int WIDTH = 160;
        int HEIGHT = 120;
        BufferedImage out = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = out.createGraphics();
        g2.setColor(Color.white);
        g2.fillRect(0, 0, WIDTH, HEIGHT);
        double width = in.getWidth();
        double height = in.getHeight();
        double xScale = WIDTH / width;
        double yScale = HEIGHT / height;
        double scale = 1.0;
        scale = Math.min(xScale, yScale);  // scale to fit
        double x = (WIDTH - width * scale) / 2;
        double y = (HEIGHT - height * scale) / 2;
        AffineTransform at = AffineTransform.getTranslateInstance(x, y);
        at.scale(scale, scale);
        g2.drawRenderedImage(in, at);
        g2.dispose();
        return out;
    }


Das Problem ist, ich will die Bilder lieber direkt mit geringerer Qualität sprich mit geringerer Auflösung laden, da die Bilder locker 10mb sind und es ca 100-500 Bilder sein werden. Die Bilder lade ich für eine Art Vorschau, sie müssen also nur ca 10% der Original Auflösung haben.

Ideen wie ich das machen kann ? Bei imageIO finde ich nichts =(

edit: benutzt wird Java auf einem Windows PC

Mfg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iWumbo« (30.12.2012, 01:16)


2

30.12.2012, 02:26

Hab es jetzt so gelöst :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private BufferedImage readImage(URL url) throws Exception{
        BufferedImage bi = null;
                InputStream istream = null;
        try {
            istream = url.openStream();
        } catch (IOException e) {
            throw new IIOException("Can't get input stream from URL!", e);
        }
        ImageInputStream stream = ImageIO.createImageInputStream(istream);
                Iterator iter = ImageIO.getImageReaders(stream);
        if (!iter.hasNext()) {
            return null;
        }
        ImageReader reader = (ImageReader)iter.next();
        ImageReadParam param = reader.getDefaultReadParam();
        param.setSourceSubsampling(50, 50, 0, 0);
        reader.setInput(stream, true, true);
        try {
            bi = reader.read(0, param);
        } finally {
            reader.dispose();
            stream.close();
        }
                return bi;
    }



Jedoch brauch er genau die gleiche Zeit die Bilder zu laden, man merkt nur dass das Programm viel weniger RAM verbraucht =/
Weitere Ideen ?

Edit:

Kurz gesagt, ich will wie Windows nur Thumbnails anzeigen, und bei bedarf die großen Bilder laden.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »iWumbo« (30.12.2012, 04:30)


David Scherfgen

Administrator

Beiträge: 10 199

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

30.12.2012, 09:48

Die wenigsten Bilddateiformate lassen sich direkt auf Anhieb in einer niedrigeren Qualität laden.
Bei JPEG musst du z.B. jeden 8x8-Pixel-Block dekodieren, egal ob du runterskalieren willst oder nicht.
Bei PNG muss für jede Bildzeile die Vorhersagefunktion ausgewertet werden. Hier könnte man theoretisch Zeilen überspringen, aber die Downsampling-Qualität wäre dann bescheiden.
Darüber sind ja meistens noch weitere Kompressionsverfahren gepackt. Die müssen alle beim Lesen wieder entpackt werden, und das kostet Zeit.
Und schließlich muss auch die Festplatte die gesamten Daten der Datei lesen. D.h. selbst bei unkomprimierten BMPs würdest du wahrscheinlich keine Zeit sparen, da alles an der Festplatte hängen würde.

Legend

Alter Hase

Beiträge: 745

Beruf: Softwareentwickler

  • Private Nachricht senden

4

30.12.2012, 10:01

Es gibt bei vielen Bildformaten aber Modi, in denen schnell eine Vorschau mit niedriger Qualität angezeigt werden kann, z.B. http://de.wikipedia.org/wiki/JPEG#Progressives_JPEG.
Aber dazu müssen die Bilder entsprechend gespeichert werden.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

David Scherfgen

Administrator

Beiträge: 10 199

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

30.12.2012, 10:02

Ja, stimmt.
Und bei manchen Bildern ist auch ein Thumbnail eingebettet.
Dieses zu lesen dürfte wohl am schnellsten sein.

6

30.12.2012, 18:16

Leute vieeelen Dank =)

Habe metadata-extractor gefunden, das Thumbnail extrahiert und schaffe die 500 Bilder in kürzester Zeit zu laden =)

Werbeanzeige