Toon posts:

[java] Save Buffered Image (jpg)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een programma waarmee je een foto kunt openen en eenvoudige bewerkingen daarop kunt uitvoeren, zoals verkleinen en draaien.
De bewerkte foto is een BufferedImage en zichtbaar op het canvas. Als het resultaat naar wens is dan dient het mogelijk te zijn de bewerkte foto op te slaan.

Na veel zoeken en proberen heb ik het volgende staan voor het opslaan:
code:
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
public void save(String naam)
{
    // Bepaal afmetingen van bewerkte plaatje
    BufferedImage rechts = uitvoerRechts.bitmap;
    double w = rechts.getWidth();
    double h = rechts.getHeight();
    // Creeer een nieuw plaatje/canvas om op te tekenen
    BufferedImage image = new BufferedImage((int)w,(int)h,BufferedImage.TYPE_INT_RGB);
    // Create a graphics for that image ?
    Graphics2D g = (Graphics2D)image.getGraphics();
    // Teken plaatje
    g.drawImage(image,(int)w,(int)h,this);
    
    // Sla het plaatje op in een bestand
    FileOutputStream fos;
    try 
    {
    fos = new FileOutputStream( saveDial.getDirectory()+saveDial.getFile() );
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
    encoder.encode(image);
    fos.flush();
    fos.close();
    }
    catch(FileNotFoundException e) {
    System.out.println(e);
    }
    catch(IOException ioe) {
    System.out.println (ioe);
    }
}


Het resultaat van deze code is dat er een plaatje opgeslagen wordt in de juiste afmetingen maar zonder inhoud.
Mijn indruk is dat ik de "kleurgegevens" van de BufferedImage nog moet overzetten naar het plaatje dat opgeslagen moet worden.

Ik ben gaan proberen om pixel voor pixel de kleur te bepalen en die dan door te geven aan het nieuwe plaatje. Helaas zonder resultaat.

Wie weet de methode/oplossing om de BufferedImage op te slaan?

  • Splatter
  • Registratie: December 2000
  • Laatst online: 26-11-2021
code:
1
2
3
4
5
    BufferedImage image = new BufferedImage((int)w,(int)h,BufferedImage.TYPE_INT_RGB);
    // Create a graphics for that image ?
    Graphics2D g = (Graphics2D)image.getGraphics();
    // Teken plaatje
    g.drawImage(image,(int)w,(int)h,this);


Je maakt hier een lege image aan en tekent vervolgens de inhoud daarvan op dezelfde image. In het drawImage() statement wil je de image rechts meegeven lijkt me.

[ Voor 5% gewijzigd door Splatter op 25-11-2004 13:51 ]


  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:57

momania

iPhone 30! Bam!

Is de ImageIO niet een makkelijkere oplossing?
Java:
1
2
3
BufferedImage bi;
File f = new File("c:\images\myimage.png");
ImageIO.write(bi, "png", f);

:)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
Ik ben met beide oplossingen aan de gang gegaan.
Aangepaste code met oplossing van Splatter
code:
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
public void save(String naam)
{
    // Bepaal afmetingen van bewerkte plaatje
    BufferedImage rechts = uitvoerRechts.bitmap;
    double w = rechts.getWidth();
    double h = rechts.getHeight();
    // Creeer een nieuw plaatje/canvas om op te tekenen
    BufferedImage image = new BufferedImage((int)w,(int)h,BufferedImage.TYPE_INT_RGB);
    // Create a graphics for that image ?
    Graphics2D g = (Graphics2D)image.getGraphics();
    // Teken plaatje
    g.drawImage(rechts,(int)w,(int)h,this);
    
    // Sla het plaatje op in een bestand
    FileOutputStream fos;
    try 
    {
    fos = new FileOutputStream( saveDial.getDirectory()+saveDial.getFile() );
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
    encoder.encode(rechts);
    fos.flush();
    fos.close();
    }
    catch(FileNotFoundException e) {
    System.out.println(e);
    }
    catch(IOException ioe) {
    System.out.println (ioe);
    }
}


en de nieuwe code met de oplossing van momania:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public void save(String naam, BufferedImage rechts)
{
// Bepaal afmetingen van bewerkte plaatje
File f = new File( saveDial.getDirectory()+saveDial.getFile() );
try 
{
    ImageIO.write(rechts,"jpg",f);
}
catch (IOException ioe) 
{
    System.out.println ("Fout bij het opslaan");
}


Steeds bekeek ik het resultaat van het opgeslagen plaatje in Internet Explorer en daar wordt de afbeelding niet weergegeven (rood kruisje). Nu blijkt dat als ik een van bovenstaande wijzigingen doorvoer dat dat zo blijft maar dat als ik het opgeslagen bestand opnieuw open met het java-programma (waarin de foto ook bewerkt is en opgeslagen is) dan wordt de foto wel juist weergegeven.

Weet iemand waarom dat gebeurt?
Het is mijn bedoeling dat het plaatje ook in Internet Explorer zichtbaar is, dus als iemand niet alleen de oorzaak weet maar ook de oplossing weet dan hoor ik het graag.

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

Misschien is het bestand nog niet door Java afgesloten als je het in Internet Explorer opent?

TheStreme - Share anything with anyone