Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] High resolution afbeeldingen tekenen

Pagina: 1
Acties:

  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
Ik heb een applicatie gemaakt waarmee je wat afbeeldingen kunt inladen en vervolgens daarvan een PDF kunt laten genereren.

Het probleem is nu dat bij het maken van de PDF de kwaliteit van de afbeeldingen heel erg achteruit gaat. Ik denk dat hij dpi verliest bij het aanroepen van drawImage().

Ik heb een panel gemaakt en deze geimplementeerd als een printablePage. Vervolgens heb ik de functie toPDF zo geimplementeerd:

Java:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public void toPDF(Graphics g, int height, int width){
        int ruimteH = (height - (3 * hoogteAfbeelding)) / 4;
        int ruimteV = (width - (2 * breedteAfbeelding)) / 3;
        
        int x1 = ruimteV;
        int x2 = ruimteV * 2 + breedteAfbeelding;
        int y1 = ruimteH;
        int y2 = 2 * ruimteH + hoogteAfbeelding;
        int y3 = 3 * ruimteH + 2 * hoogteAfbeelding;
        
        ImageIcon i1 = ((ImageIcon)label1.getIcon());
        ImageIcon i2 = ((ImageIcon)label2.getIcon());
        ImageIcon i3 = ((ImageIcon)label3.getIcon());

        Color oldColor = g.getColor();
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x2, y1, breedteAfbeelding, hoogteAfbeelding);
        g.fillRect(x2, y2, breedteAfbeelding, hoogteAfbeelding);
        g.fillRect(x2, y3, breedteAfbeelding, hoogteAfbeelding);
        g.setColor(oldColor);
        

        g.drawString("Pagina "+ this.pageIndex, (width/2)-15, height-20);
        
        
        if(i1 != null){        
            Image image1 = i1.getImage();
            int paddingV = (hoogteAfbeelding - (int)image1.getHeight(this))/2;
            int paddingH = (breedteAfbeelding - (int)image1.getWidth(this))/2;
            g.drawImage(image1, x1 + paddingH, y1 + paddingV, this);
        }
        if(i2 != null){
            Image image2 = i2.getImage();
            int paddingV = (hoogteAfbeelding - (int)image2.getHeight(this))/2;
            int paddingH = (breedteAfbeelding - (int)image2.getWidth(this))/2;
            g.drawImage(image2, x1 + paddingH, y2 + paddingV, this);
        }
        if(i3 != null){
            Image image3 = i3.getImage();
            
            int paddingV = (hoogteAfbeelding - (int)image3.getHeight(this))/2;
            int paddingH = (breedteAfbeelding - (int)image3.getWidth(this))/2;
            g.drawImage(image3, x1 + paddingH, y3 + paddingV, this);
        }
        
}


Hoe kan ik zorgen dat de kwaliteit van de afbeeldingen niet achteruit gaat? Heb al wat gegoogled, maar heb zo'n idee dat het met de methodes van Graphics2D niet gaat lukken.

Alvast bedankt ;)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Wat is de afmeting van de afbeelding en met welke waarden roep je deze functie aan?

--

Hoe verifieer je de kwaliteit van de afbeelding? Heb je beiden ook al eens afgedrukt?

[ Voor 36% gewijzigd door Janoz op 01-10-2007 14:16 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:29

Haan

dotnetter

Graphics2D kan je wel veel meer mee en is opzich een kleine moeite om daarnaar te veranderen, dus ik zou het wel proberen. Ook kan je veel precieser werken met floats of doubles ipv alleen integers.

Kater? Eerst water, de rest komt later


  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
De afbeeldingen die ik inlaad zijn van willekeurige grootte, hij schaalt deze altijd tot 300x300 (hoogteAfbeelding en breedteAfbeelding). Maar zelfs bij het inladen van een afbeelding van 300x300 verliest hij veel kwaliteit.

De functie wordt zo aangroepen:

Java:
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
26
27
28
29
30
31
32
33
34
35
36
37
try {
        String filename = chooser.getSelectedFile().getAbsolutePath();
        filename = filename.endsWith(".pdf") ? "" : filename +".pdf";
        
        java.io.FileOutputStream fos = new java.io.FileOutputStream(filename);
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();
        com.lowagie.text.Rectangle size = document.getPageSize();
        int w = (int)size.getWidth();
        int h = (int)size.getHeight();
        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp;

        Graphics2D g2;
        
        int pageIndex;
        for(pageIndex = 0;pageIndex<tabs.getTabCount();pageIndex++){
            tp = cb.createTemplate(w, h);
            g2 = tp.createGraphics(w, h);          
            
            PrintablePage pagina = (PrintablePage)tabs.getComponentAt(pageIndex);
            if(pagina != null){
                pagina.toPDF(g2,h,w);
                cb.addTemplate(tp, 0, 0);                       
                if(pageIndex < tabs.getTabCount() -1 ){
                    document.newPage();
                }
            }
        }
        document.close();
}
catch(DocumentException de) {
        System.err.println(de.getMessage());
}
catch(java.io.IOException ioe) {
        System.err.println(ioe.getMessage());
}               

  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
Merk met Graphics2D wel een klein verschil, maar het is nog steeds niet wat ik wil...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

hmm, 300 bij 300 wil ik in de verste verte niet eens High resolution noemen.

Sowieso zie ik in de toPdf methode weinig dingen die de kwaliteit zouden verminderen.

Bedenk wel dat iets er op papier erg anders uit kan zien dan op het scherm. 72dpi op het scherm geeft een scherp beeld terwijl 300dpi op papier eerder wat blokkerig lijkt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
Als ik de afbeelding gewoon zo los uitprint is er niks aan de hand en heb ik prachtige kwaliteit. Even kijken of ik een before en after plaatje kan maken...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Een linkje naar het plaatje en de gegenereerde pdf zou wel handig zijn inderdaad.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
zie: Afbeeldingslocatie: http://img518.imageshack.us/img518/9431/pdfqualitytesteu2.png

Links is orgineel... rechts is de genereerde PDF

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:45

TeeDee

CQB 241

Waarmee genereer je de PDF bestanden? Zo te zien met iText? Heb helaas de documentatie van iText niet bij de hand maar je kon ergens een property setten met betrekking tot de kwaliteit.

Zal nog eens even neuzen...

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MaZeS
  • Registratie: Januari 2003
  • Laatst online: 18-09-2024
Ik ggebruik inderdaad iText van Lowagie.
Ik dacht zelf eerst dat het probleem bij het scalen lag, maar als ik de scale-functie eruit sloop (zoals in mijn afbeelding), blijft de kwaliteit erg slecht

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Ik zie een aantal dingen die mij niet helemaal duidelijk zijn:

- document.getPageSize(): Wat is dat voor een eenheid, en waarom maak je opeens ints van size.getWidth() en getHeight(), terwijl overal floats verwacht worden ?
- tp.createGraphics(w, h): hier worden dus ook floats verwacht, en ik vraag me af hoe zich dat dan weer uiteindelijk in het Graphics object uitwerkt. In neem niet aan dat dat gewoon pixels zullen zijn...

* voodooless heeft geen idee hoe die lib verder werkt, heeft alleen even naar de api docs gekeken ;)

[ Voor 9% gewijzigd door voodooless op 08-10-2007 10:21 ]

Do diamonds shine on the dark side of the moon :?

Pagina: 1