[JEE] Open source TIFF viewer voor web applicatie

Pagina: 1
Acties:

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Voor een project maken wij een webapplicatie waarin .tiff bestanden getoond dienen te worden. Nu zou dat opzich geen punt zijn maar de .tiffjes moeten dus ook gedraaid en op ingezoomd kunnen worden.

Nu ben ik er 1 tegen gekomen op basis van GPL licentie, Java DjVu maar hiermee kan dus niet gedraaid worden.

Verder zijn er nog een aantal van die API's alleen vallen die helaas niet onder GPL en moet er een of andere licentie afgesloten worden.

Dus mocht iemand een variant weten hoor ik dat graag.

Be fast .... Be furious....


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Ben je nu opzoek naar een kant en klare tiff viewer of wil je dit nu zelf gaan maken? Hier in PRG zien we natuurlijk liever alleen het laatste :) (en het eerste is een scriptrequest wat een slotje betekent ;) ).
Als je een tiff eenmaal kan tonen lijkt me het draaien me opzich geen moeite meer.

Overigens vind ik met google al vrij snel http://java.sun.com/products/java-media/jai/iio.html. Daar staat dat tiff ook wordt ondersteunt dus lijkt me dat je hier mee uit de voeten moet kunnen?

[ Voor 7% gewijzigd door Creepy op 05-05-2007 20:42 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Creepy schreef op zaterdag 05 mei 2007 @ 20:41:
Ben je nu opzoek naar een kant en klare tiff viewer of wil je dit nu zelf gaan maken? Hier in PRG zien we natuurlijk liever alleen het laatste :) (en het eerste is een scriptrequest wat een slotje betekent ;) ).
Als je een tiff eenmaal kan tonen lijkt me het draaien me opzich geen moeite meer.

Overigens vind ik met google al vrij snel http://java.sun.com/products/java-media/jai/iio.html. Daar staat dat tiff ook wordt ondersteunt dus lijkt me dat je hier mee uit de voeten moet kunnen?
Dat laatste ziet er idd goed uit en ga ik ook zeker naar kijken of rotate en zoomen mogelijk zijn.

Ik zoek naar een oplossing waarvoor geen licenties aan kleven. Als dit inhoud het zelf maken is dat natuurlijk ook een optie.

Verder leek het mij dat ik niet de enige ben die dit ooit gewild heeft. En aangezien ik met zoeken alleen op oplossingen kwam die geld kosten dacht ik het zo te proberen.

Be fast .... Be furious....


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

voodooless

Sound is no voodoo!

Dit lijkt me toch niet zo lastig te vinden...

* voodooless gaat ff een minutje googelen:

http://schmidt.devlib.org/java/pixel-image-io-libraries.html heeft en lijstje, en er staan ook zat open source pakketten bij.

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


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik ben nu dus begonnen met het zelf maken van een picture viewer. Nu heb ik onderstaande code in elkaar geflanst.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import java.awt.BorderLayout;
import java.awt.image.renderable.ParameterBlock;

import java.util.Hashtable;

import javax.media.jai.InterpolationBilinear;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.sun.media.jai.widget.DisplayJAI;

import javax.media.jai.InterpolationNearest;

public class RotationScaleTest extends JFrame implements ChangeListener {
    private JSlider sliderRotate;
    private JSlider sliderScale;
    private JCheckBox interactive;
    private JCheckBox centerRotate;
    private PlanarImage image;
    private DisplayJAI display;


    public RotationScaleTest(String filename, PlanarImage image) {
        super("Viewing " + filename);
        this.image = image;
            
        display = new DisplayJAI(image);
        //Kleiner maken 
        float scale = 30/100f;
        
        ParameterBlock pb = new ParameterBlock();
        pb.addSource(image);
        pb.add(scale);
        pb.add(scale);
        pb.add(0.0F);
        pb.add(0.0F);
        pb.add(new InterpolationNearest());
        
        PlanarImage scaledImage = JAI.create("scale", pb);
        display.set(scaledImage);
        getContentPane().setLayout(new BorderLayout());
        
        getContentPane().add(new JScrollPane(display), BorderLayout.CENTER);

        JPanel controlPanel = new JPanel(new BorderLayout());

        sliderRotate = new JSlider(0, 360, 0);
        Hashtable<Integer, JLabel> sliderLabelsRotate = 
            new Hashtable<Integer, JLabel>();
        for (int label = 0; label <= 360; label += 90)
            sliderLabelsRotate.put(new Integer(label), new JLabel("" + label));
        sliderRotate.setLabelTable(sliderLabelsRotate);
        sliderRotate.setPaintLabels(true);

        sliderScale = new JSlider(10, 500, 50);
        Hashtable<Integer, JLabel> sliderLabelsScale = 
            new Hashtable<Integer, JLabel>();
        sliderLabelsScale.put(new Integer(10), new JLabel("10"));
        for (int label = 50; label <= 500; label += 50)
            sliderLabelsScale.put(new Integer(label), new JLabel("" + label));
        sliderScale.setLabelTable(sliderLabelsScale);
        sliderScale.setPaintLabels(true);
        sliderScale.setName("scale");
        
        interactive = new JCheckBox("Interactive", false);
        controlPanel.add(interactive, BorderLayout.WEST);

        centerRotate = new JCheckBox("Center", true);
        controlPanel.add(centerRotate, BorderLayout.EAST);
        
        sliderRotate.addChangeListener(this);
        sliderScale.addChangeListener(this);
        sliderRotate.setName("rotate");
        controlPanel.add(sliderRotate, BorderLayout.CENTER);
        controlPanel.add(sliderScale, BorderLayout.SOUTH);
        getContentPane().add(controlPanel, BorderLayout.NORTH);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }


    public void stateChanged(ChangeEvent e) {
             
        if (sliderRotate.getValueIsAdjusting() && !interactive.isSelected())
            return;

        float angle = (float)Math.toRadians(sliderRotate.getValue());

        float centerX = 0f;
        float centerY = 0f;
        if (centerRotate.isSelected()) {
            centerX = image.getWidth() / 2f;
            centerY = image.getHeight() / 2f;
        }

        ParameterBlock pb = new ParameterBlock();
        pb.addSource(image);
        pb.add(centerX);
        pb.add(centerY);
        pb.add(angle);
        pb.add(new InterpolationBilinear());

        PlanarImage rotatedImage = JAI.create("rotate", pb);
        display.set(rotatedImage);
    }


    public static void main(String[] args) {
        PlanarImage image = JAI.create("fileload", "C:\\09");

        new RotationScaleTest("C:\\09", image);
    }


Daar ondervind ik echter een aantal puntjes mee.

Als eerste:
De plaatjes zijn vrij groot hiervoor maak ik deze eerst kleiner maar als ik nu ga rotaten doet hij dat met het orgineel ipv de verkleinde versie van het plaatje.

Als tweede:
Bij het draaien krijg ik zwarte balken om het plaatje en het plaatje draait in de hoek ipv center waardoor er stukken wegvallen.

Als derde:
Ik krijg het niet voor elkaar in de stateChanged methode onderscheid te maken tussen de verschillenden sliders.
Want bij de ene moet er gedraait worden en bij de ander gezoomd

Als vierde:
Overall probleem; De staat van het plaatje moet bewaard blijven dus als ik net gedraait heb en ik ga zoomen moet ik zoomen op het gedraaide plaatje en niet met het orgineel.

Be fast .... Be furious....


  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

Punt 1 is gerelateerd aan punt 4

Punt 2 lijkt me logisch. Wil je om het centrum draaien dan zul je eerst moeten transleren. Daarnaast is het plaatje vierkant. Draai je dat 45 graden dan heb je inderdaad stukken op het scherm waar je geen gegevens van het plaatje zijn

Voor punt 3 moet je waarschijnlijk even kijken naar wat er allemaal met event mogelijk is of iets meer met de sliders zelf gaan doen.

Bij punt 4 moet je gewoon zelf onthouden wat er allemaal veranderd is zodat je je bewerking uit kunt voeren op het resultaat van de vorige actie ipv het orgineel.

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


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Janoz schreef op dinsdag 08 mei 2007 @ 11:24:
Punt 1 is gerelateerd aan punt 4

Punt 2 lijkt me logisch. Wil je om het centrum draaien dan zul je eerst moeten transleren. Daarnaast is het plaatje vierkant. Draai je dat 45 graden dan heb je inderdaad stukken op het scherm waar je geen gegevens van het plaatje zijn

Voor punt 3 moet je waarschijnlijk even kijken naar wat er allemaal met event mogelijk is of iets meer met de sliders zelf gaan doen.

Bij punt 4 moet je gewoon zelf onthouden wat er allemaal veranderd is zodat je je bewerking uit kunt voeren op het resultaat van de vorige actie ipv het orgineel.
Alles is tot nu toe opgelost behalve punt 2. Zo irritant is het niet en ik wacht wel af wat de klant er van gaat zeggen.

Verder ben ik nu tegen een ander punt gelopen.

Als ik een tiff met meeredere pagina's wil printen print hij alleen maar de eerste.

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
47
48
49
50
51
52
public class RotationScaleTest extends JFrame implements Printable {
  

   //hoop andere code

    protected void print() {
        pj = PrinterJob.getPrinterJob();
        pj.setPrintable(this);

        boolean doPrint = pj.printDialog();
        if (doPrint) {
            try {

                pj.print();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    


    public int print(Graphics g, PageFormat f, int pageIndex) {
        System.err.println(pageIndex); //output 0,1
        if (pageIndex >= 1) {
            return Printable.NO_SUCH_PAGE;
        }
        
        RenderedImage renderedImage = getOriginalImagePrint();
        if (renderedImage != null) {
            // convert to a BufferedImage since I cannot write a RenderedImage for some reason
            BufferedImage good = 
                new BufferedImage(renderedImage.getWidth(), renderedImage.getHeight(), 
                                  BufferedImage.TYPE_BYTE_GRAY);
            Graphics2D g2dtemp = (Graphics2D)good.getGraphics();
            g2dtemp.drawRenderedImage(renderedImage, new AffineTransform());

            Graphics2D g2d = (Graphics2D)g;
            g2d.translate(f.getImageableX(), f.getImageableY());
            g2d.drawImage(good, 0, 0, (int)f.getImageableWidth(), 
                          (int)f.getImageableHeight(), 0, 0, 
                          renderedImage.getWidth(), renderedImage.getHeight(), 
                          null);
            return Printable.PAGE_EXISTS;

        } else {
            return Printable.NO_SUCH_PAGE;
        }
   
    }
}


Hij geeft bij de pageIndex wel aan dat er 2 voorbij komen index 0 en 1.

Maar hij print alleen de eerste pagina.

[ Voor 53% gewijzigd door Bl4ckviper op 09-05-2007 13:56 ]

Be fast .... Be furious....


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
*Kick*

Iemand?

Be fast .... Be furious....


  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

Wat heb je zelf allemaal al geprobeert?

Bedenk dat een rotatie over een ander punt natuurlijk niks meer is dan het verplaatsen van je plaatje gevolgd door de gewenste rotatie, waarnaar je tot slot het plaatje weer op de orginele positie terugzet.

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


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Het roteren gaat goed het gaat nu om het printen. Hiervoor gebruik ik een orgineel image waar niets mee gedaan is. (niet gescaled en niet gerotate).

Wat het printen betreft: Stel er is een tiff van 4 pagina's

Dan gebeurt het volgende:
- De pageIndex wordt netjes opgehoogt
- Er word 4 keer de eerste pagina geprint terwijl de pageIndex dus wel opgehoogt word.

Ik heb verschillende soorten print methodes geprobeert die ik tegen gekomen was nav zoekwerk op het SUN Forum.

Be fast .... Be furious....


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

voodooless

Sound is no voodoo!

Roteren kun je veel beter doen met java2D. JAI is oud en en moet je eigenlijk niet willen gebruiken.

java2D kan prima een plaatjes rond een willekeurig punt roteren, en is ook nog eens best snel (volgens mij zelfs OpenGL accelerated in de laatste java versies als je het aanzet) :)

[ Voor 47% gewijzigd door voodooless op 10-05-2007 09:49 ]

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


  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 24-11 12:28

dawuss

gadgeteer

voodooless schreef op donderdag 10 mei 2007 @ 09:48:
Roteren kun je veel beter doen met java2D. JAI is oud en en moet je eigenlijk niet willen gebruiken.

java2D kan prima een plaatjes rond een willekeurig punt roteren, en is ook nog eens best snel (volgens mij zelfs OpenGL accelerated in de laatste java versies als je het aanzet) :)
Natuurlijk wel tricky binnen J2EE, omdat het geen client omgeving is, maar wellicht heb je hier wat aan: http://www.mullassery.com/software/taglibs/

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

dawuss schreef op donderdag 10 mei 2007 @ 09:53:
[...]


Natuurlijk wel tricky binnen J2EE
Nou gezien dit:
public class RotationScaleTest extends JFrame
vermoed ik dat TS helemaal niet met j2ee bezig is en dat het dus een fixe typo in de topictitel is.

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


  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 24-11 12:28

dawuss

gadgeteer

Janoz schreef op donderdag 10 mei 2007 @ 09:57:
vermoed ik dat TS helemaal niet met j2ee bezig is en dat het dus een fixe typo in de topictitel is.
Ik doelde ook een beetje op
Voor een project maken wij een webapplicatie waarin .tiff bestanden getoond dienen te worden
Wellicht is het handig als de topicstarter eerst wat meer duidelijkheid hierover geeft? Wil je het volledig web-based houden, of mag er bijvoorbeeld ook best een applet draaien?

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


Verwijderd

voodooless schreef op donderdag 10 mei 2007 @ 09:48:
Roteren kun je veel beter doen met java2D. JAI is oud en en moet je eigenlijk niet willen gebruiken.
Heb je daar ook argumenten voor of blijft het bij een inhoudsloos statement?

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
De viewer word aangroepen vanuit een webapplicatie.

Over de snelheid van roteren, pagina's tonen, en scalen heb ik totaal geen klachten het gaat gewoon snel. Ik ben op JAI uitgekomen door de reactie van creepy eerder in deze post.

Het print probleem is nu ook opgelost. Voor het printen maak ik een RenderedImage voor iedere pageIndex aan middels het volgende statement

Java:
1
RenderedImage renderedPrint = dec.decodeAsRenderedImage(pageIndex);


De gehele viewer is nu klaar en kan roteren, scalen, meerder pagina's bekijken en printen.

edit:
Een applet had ook gekund.. Dit was het eerste wat ik tegen kwam nadat de zoektoch naar iets bestaand als niet succesvol beschouwd kon worden. Verder heb ik niet zoveel ervaring met dit soort dingen. Ik maak meestel gebruik van de componenten die het ontwikkel framework bied.

[ Voor 20% gewijzigd door Bl4ckviper op 10-05-2007 11:32 ]

Be fast .... Be furious....

Pagina: 1