Avatar billede o-zone Nybegynder
06. marts 2007 - 11:43 Der er 3 kommentarer og
1 løsning

Nedjustere antallet af farver i et jpg til 8 bit

Hej med jer...

Jeg skal hente nogle jpg billeder fra nettet og gemme dem som gif billeder.
Jeg har brugt ImageIO til at hente mit billede (takket være http://www.eksperten.dk/spm/763694), og det virker fint. Jeg har prøvet at gemme det som gif vha ImageIO, men det duer ikke, fordi der er for mange farver i jpg billedet. Jeg har siden fundet ud af at mit program skal matche en ældre version java, så jeg tør alligevel ikke binde an på at den selv kan encode gif.

Jeg har siden kastet min lid til Acme.JPM.Decoders.GifEncoder (http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html) som et seriøst bud på en gif encoder. Det hele går også fint, indtil jeg skal til at konvertere. Den bryder sig HELLER ikke om de mange farver.

Jeg kan se at Acmes encoder har en SetColorModel metode, og det lyder jo som et oplagt sted at få skruet ned for antallet af farver. :-?
Nu ville det have været rart hvis jeg bare havde kunnet lave en new ColorModel(8), men i alle subclasses til ColorModel skal jeg så vidt jeg kan se ud i at have byte[] af billedet.

Jeg vil være rigtig ked af, hvis jeg selv "manuelt" skal til at regne mig frem til hvilke farver der skal mappes til hvad, og gennemgå billederne pixel for pixel. Er der virkelig ikke en nem måde at nedjustere antallet af farver i et billede (og stadig få et resultat der er til at holde ud at se på)?

Til dem der gerne vil se kode så har jeg ekstraheret essensen her:
---8<----------
bImage = ImageIO.read(new URL("http://domæne.dk/billede.jpg"));
FileOutputStream fileOutputStream = new FileOutputStream(new File("c:\\billede.gif"));
GifEncoder gifEncoder = new GifEncoder(bImage, fileOutputStream);
gifEncoder.setColorModel(new IndexColorModel(8,hvad-skal-jeg-dog-finde-på-at-skrive-her???));
gifEncoder.encode();
fileOutputStream.close();
---8<----------

nogen gode ideer?
Avatar billede o-zone Nybegynder
07. marts 2007 - 10:32 #1
På denne side har jeg selv fundet en klasse som tilsyneladende kan gøre tricket (det ser dog ud til at den går fra 24-bit til f.eks. 8-bit - burde den ikke kunne klare 32-bit også?)

Jeg prøver den i hvert fald lige af, og så vender jeg tilbage hertil med mine resultater! :D

P.S. Lad det nu ikke hindre jer, hvis I har fornuftige indlæg i tråden. I skal nok få points for hvad I nu kan komme op med!

P.P.S. På de sample billeder der er på siden jeg refererer til, ser det ud til at "Fast Dithered Median Cut" er den klart hurtigste algoritme, men det ser ikke ud til at den har noget at gøre med NeuQuant (som er den klasse jeg har fået gravet frem). Er der nogen af jer der ved hvor jeg kan få fat i en Fast Dithered Median Cut klasse (eller evt. algoritmen)?
Avatar billede o-zone Nybegynder
07. marts 2007 - 10:33 #2
he he he ... og det var så selvfølgelig denne side jeg skrev om før: http://members.ozemail.com.au/~dekker/NEUQUANT.HTML
:"-)
Avatar billede o-zone Nybegynder
07. marts 2007 - 11:20 #3
NeuQuant er ***MESTEREN***!!! :-D

Deres licenspolitik ser ud til at være den mindst restriktive jeg endnu har set, al balladen ligger i en enkelt klasse, og sourcekoden fylder under 500 linier.

Jeg er SÅ imponeret over kvaliteten af deres resultat (og hvor nem klassen er at bruge), og hastigheden var ikke i nærheden af noget jeg lod mig skræmme af! :)

TOP TOP TOP thumbs up kvalitet på alle måder!

Fordi jeg er så fandens uselvisk af natur, vil jeg poste al min (væsentlige) kildekode her, og så må I jo gøre med den hvad I vil :)

Her kommer (om lidt) en metode til at konvertere jpg billeder til gif :-D
non-exclusively for the users of eksperten.dk
Sourcekoden til NeuQuant klassen kan hentes her: http://members.ozemail.com.au/~dekker/NeuQuant.java
Avatar billede o-zone Nybegynder
07. marts 2007 - 12:26 #4
ok ok ok ... koldt vand i blodet nu.
Jeg var jo kommet til at overse den lille detalje at jeg rent faktisk gemte mit billede i jpg format, men med efternavnet .gif
- Så tro da pokker at jeg var imponeret over kvaliteten! :-/

Jeg har prøvet at gemme det som gif, men der ville ImageIO desværre ikke være med, så jeg kommer alligevel ikke uden om Acmes GifEncoder.
Efter at jeg rent faktisk konverterer billedet (doh!), er jeg stadig tilfreds med hastigheden, men kvaliteten er jo så droppet en smule til det mere realistiske (men den er absolut stadig brugbar).

Jeg kom jo til at love jer noget sovs i min sejrsrus sidst, så here goes:

---8<-----------
    public static void saveAsGif(String sourceURL, String destinationPath) throws IOException {
        BufferedImage srcImage = ImageIO.read(new URL(sourceURL));
        ColorModel cm = srcImage.getColorModel();
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
       
        BufferedImage filteredImage = new BufferedImage(cm,cm.createCompatibleWritableRaster(width, height),cm.isAlphaPremultiplied(),null);
        NeuQuant nq = new NeuQuant(srcImage, width, height);
        nq.init();

        for (int y=0;y<height;y++) {
            for (int x=0;x<width;x++) {
                filteredImage.setRGB (x, y, nq.convert(srcImage.getRGB(x, y)));
            }
        }

        // Det HAVDE jo været nemt hvis følgende linie havde virket her!
        // ImageIO.write(filteredImage,"gif",new File(destinationPath));
        FileOutputStream fileOutputStream = new FileOutputStream(new File(destinationPath));
        GifEncoder gifEncoder = new GifEncoder(filteredImage, fileOutputStream);
        gifEncoder.encode();
        fileOutputStream.close();
    }
---8<-----------

men nu kræver den jo så både NeuQuant klassen som kan hentes fra:
http://members.ozemail.com.au/~dekker/NeuQuant.java og
Acme IntHash, ImageEncoder og GifEncoder der kan hentes fra følgende adresser:
http://www.acme.com/java/software/Acme.IntHashtable.html
http://www.acme.com/java/software/Acme.JPM.Encoders.ImageEncoder.html
http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html

Til gengæld har I så en metode der tager en URL til et jpg billede, og en PATH til en (kommende) gif fil :)
... det bliver da ikke meget nemmere? ;-)

Med denne gang en smule mindre euforiske hilsner
/o-zone
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester