Zachowanie pliku graficznego o określonym DPI

0

Witam

Szukam i nie umiem znaleźć ani w Graphics2D ani w JAI metody, która by mi umożliwiała zapisanie JPEG/GIF'a etc o określonym DPI...moje niedopatrzenie? Zauważyłem, że standartowo zapisując przez ImageIO plik ma ZAWSZE 70 DPI - czy to jest jakaś uniwersalna liczba? Jak zapisać obraz w większym DPI?

Finalny Jpeg jest mi potrzebny do drukowania a nie wyświetlania na ekranie!!:)

0

Bo to jest taki feature którego nie ma w dokumentacji:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
 
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.FileImageInputStream;
 
import org.w3c.dom.Element;
import org.w3c.dom.Node;
 
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
 
public class JpegDensity {
    public static void main(String[] args) throws Exception {
        File infile = new File("test.jpg");
        File outfile = new File("density.jpg");
 
        ImageReader reader = ImageIO.getImageReadersByFormatName("jpeg").next();
        reader.setInput(new FileImageInputStream(infile), true, false);
        IIOMetadata data = reader.getImageMetadata(0);
        BufferedImage image = reader.read(0);
 
        Element tree = (Element) data.getAsTree("javax_imageio_jpeg_image_1.0");
        Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
        for (int i = 0; i < jfif.getAttributes().getLength(); i++) {
            Node attribute = jfif.getAttributes().item(i);
            System.out.println(attribute.getNodeName() + "="
                    + attribute.getNodeValue());
        }
 
        JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outfile));
        JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
        jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
        jpegEncodeParam.setXDensity(300);
        jpegEncodeParam.setYDensity(300);
        jpegEncoder.encode(image, jpegEncodeParam);
    }
}
0

ooo...fajny fuczer...teraz już idę spać, ale z samego rana w pracy odpalę i zobaczę.

Dzięki!!

PS: Czy ktoś się spotkał z podobnym rozwiązaniem w JAI?

0

Wszystko fajnie tylko że....

To jest jakieś APi niestandardowe - nie we wszystkich javovych maszynach jest...tylko chyba znajduje się w SDK Suna-w sumie nie byłoby w tym nic specjalnego ale przy kompilacji za każdym razem dostaje masę warningów i komunikat ze może od następnej wersji javy już tego może nie być:/

I teraz pytanie - gdzie są źródła tego API w SDK u mnie na dysku bym sobie mógł je skopiować i dołączyć bezposrednio ten pakiet: com.sun.image.codec.jpeg do mojego projektu??? Nietrywialne pytanie....a jak nie to gdzie tego poszukać na necie? Na http://grepcode.com/ jest okrojona wersja jakaś...

pozdrawiam

0

Rozpakuj rt.jar z JRE. Będzie tam ten pakiet.

0
Koziołek napisał(a)

Rozpakuj rt.jar z JRE. Będzie tam ten pakiet.

No, spakuj do swojej aplikacji i rozprowadzaj razem z nia.

A pozniej czekaj na wezwanie do sadu od Oracla bo zlamales licencje.

0

@::., zgodnie można redystrybuować JRE razem z aplikacją. Nie wolno tylko dystrybuować JRE jako "własnego" i nie można dzielić go w sposób naruszający interesy Oracla. Kolega chciał tylko wiedzieć gdzie znajdują się pakiety tak poza tym...

0

A tak w ogóle to nie jest Oracla tylko Suna:) tak, tak.....to że Suna wchłonęło to ale widac niekompletnie ponieważ już po "fuzji" jest "com.sun.image.codec.jpeg.JPEGImageEncoder is Sun proprietary API".

A w licencji tego pakietu jest napisane, że można rozpowszechniać na licencji GNU...więc sądu nie będzie.

0

@lipkerson, tylko pamiętaj "co używa gnu musi być gnu" :D

0
lipkerson napisał(a)

A tak w ogóle to nie jest Oracla tylko Suna:) tak, tak.....to że Suna wchłonęło to ale widac niekompletnie ponieważ już po "fuzji" jest "com.sun.image.codec.jpeg.JPEGImageEncoder is Sun proprietary API".

A w licencji tego pakietu jest napisane, że można rozpowszechniać na licencji GNU...więc sądu nie będzie.

Byl taki motyw w eclipse 3.6 chyba, ze nagle zaczal sie sypac OutOfMemoryError dla nowszych wersji javy, powiedzmy 1.6u20. Problemem bylo to ze eclipse sprawdzal czy JRE jest suna, i jesli jest, to dodawal pamieci do Xmx. Oracle w update 20 zmienil nazwe swojej wirtualnej maszyny, takze zamiast powiedzmy "sunjre" pojawialo sie "oraclejre", i ten trik w Eclipse przestal dzialac. Ludzie odkryli przyczyne, eclipse zrobil fix, Oracle cofnal ta zmiane w kolejnym update 21, ale zapowiedzial ze ta zmiana zostanie wprowadzona. Podobnie ma sie stac z pakietami. Wiec nie bylbym pewien czy sun.misc i inne zostana, przeciez to jest zaden problem zmienic te stringi. A ze kod ktory uzywa tego przestanie nagle dzialac? No trudno, zawsze mowili ze to jest nieoficjalne API prawda?

  • Nie jestem pewien co do wersji, ale Oracle juz 2 razy wydal updaty do JRE 6 ktore musial po paru dniach poprawiac i wydawal nowe, raz wlasnie z tego powodu, i raz costam z JWS chyba.
0

No to koledzy mam problem: dostałem się do tych class i je rozwaliłem na .java

Ładnie sobie nazwałem pakiet by się nie dublował z tym pierwszym i pojawił się błąd którego nie rozumiem:

W kodzie klasy JPEGCodec są metody, które w return mają dawać obiekt klasy JPEGImageDecoder a return wygląda tak:

    public static JPEGImageDecoder createJPEGDecoder(InputStream inputstream)
    {
        return new JPEGImageDecoderImpl(inputstream);
    }

Znalazłem klase JPEGImageDecoderImpl w sun.awt.image.codec ale wątpię by dawała obiekt z klasy JPEGImageDecoder. Trochę jestem zdezorientowany..........

Pakiet z plikami java to tylko 6-7 klas...mogę wysłać i może doradzicie?

Pliki .java z tego pakietu załączam: http://wyslijto.pl/plik/g91rgbs4a8

PS: A tak w ogóle to boli mnie te całe wykupienie Suna przez Oracla...oni zniszczą Jave dla zwykłych śmiertelników lub zaprzestaną wspierania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1