Avatar billede deepcore Nybegynder
21. maj 2006 - 19:27 Der er 3 kommentarer og
1 løsning

Skrive en streng på et bufferedimage.

Jeg har brug for at skrive en streng på et jpg billede og resize det til et thumbnail.

Kort fortalt loader jeg først det originale billede til et buffered image,
laver et nyt buffered image med de ønskede dimmensioner og skriver det originale billede til det.

det virker fint. problemet i at jeg har brug for at skrive tekst på det originale bufferedimage så teksten bliver resizet med. Koden kører flere gange da der skal laves flere forskellige thumbnails af det samme billede, og teksten skulle helst se ens ud på dem alle.


min kode ser således ud:


package applicationServer;

import com.sun.image.codec.jpeg.JPEGEncodeParam;

import com.sun.image.codec.jpeg.*;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;


public class ImageMaker {
    File originalFile=null;
    BufferedImage originalBufferedImage=null;
    BufferedImage newBufferedImage=null;
    int newXSize;
    int newYSize;
    int newColorDepth;
    String clientName="SampleClient";
    String text="";
   
    public ImageMaker() {
    }
   
    public void setClientName(String clientName){
        this.clientName=clientName;
    }
   
    public void makeImage(String text, int maxWidth, int maxHeight, int maxColorDepth){
        this.text=text;
        newXSize=maxWidth;
        newYSize=maxHeight;
        newColorDepth=maxColorDepth;

        loadOriginalImage();
        writeTextOnOriginalImage();
        adjustNewImageSize();
        makeScaleImage();
        saveNewImage();
    }
   
    public void loadOriginalImage()
    {
      try
      {
     
        originalFile = new File("U:\blabla");
        originalBufferedImage=ImageIO.read(originalFile);
      }
      catch (IOException iEx)
      {
        iEx.printStackTrace();
      }
    }
   
    private void writeTextOnOriginalImage(){
        Graphics2D g = originalBufferedImage.createGraphics();
        g.setFont(new Font("Dialog",Font.PLAIN,20));
        g.drawImage(originalBufferedImage,0,0,originalBufferedImage.getWidth(),originalBufferedImage.getHeight(),null);
        g.drawString("lala",10,30);
    }
   
   
    private void makeScaleImage()
    {
      newBufferedImage = new BufferedImage(newXSize, newYSize, originalBufferedImage.getType());
      Graphics2D graphics2D = newBufferedImage.createGraphics();
      graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      graphics2D.drawImage(originalBufferedImage,0,0,newXSize,newYSize,null);
       
    }
   
    private void adjustNewImageSize(){
        double newImageRatio = (double)newXSize/(double)newYSize;
        double originalImageRatio = (double)originalBufferedImage.getWidth()/(double)originalBufferedImage.getHeight();
        if(newImageRatio < originalImageRatio){
            newYSize= (int)(newXSize/originalImageRatio);
        }
        else{
            newXSize= (int)(newYSize * originalImageRatio);
        }
    }
   
    private void saveNewImage(){
        try  {
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(clientName+".jpg"));
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferedOutputStream);
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(newBufferedImage);
            encoder.setJPEGEncodeParam(param);
            encoder.encode(newBufferedImage);
            bufferedOutputStream.close();   
        } catch (Exception ex)  {
            ex.printStackTrace();
        }
    }
}

Jeg er ikke en hej til grafik, men jeg kan ikke forstå det her ikke virker. med de same kode som i writeTextOnOriginalImage();
kan jeg fint skrive på det resizede billede.

Ved nogen hvordan jeg kan få det til at virke?
Avatar billede _carsten Nybegynder
21. maj 2006 - 20:53 #1
Hvis du udkommenterer "g.drawImage" bør "g" skrive på dit originalBufferedImage

    private void writeTextOnOriginalImage(){
        Graphics2D g = originalBufferedImage.createGraphics();
        g.setFont(new Font("Dialog",Font.PLAIN,20));
        //g.drawImage(originalBufferedImage,0,0,originalBufferedImage.getWidth(),originalBufferedImage.getHeight(),null);
        g.drawString("lala",10,30);
    }
Avatar billede _carsten Nybegynder
21. maj 2006 - 21:15 #2
Måske har dit image samme farve som dit graphics object bruger.

Har du prøvet at skifte font farve, g.setColor(Color.white) ??

Umiddelbart kan jeg ikke se, det skulle være et problem at skrive tekst på det image
Avatar billede deepcore Nybegynder
21. maj 2006 - 23:09 #3
tjah, nu virker det... synes ellers jeg havde prøvet - men tak for hjælpen. smid et svar :)
Avatar billede _carsten Nybegynder
22. maj 2006 - 07:48 #4
Kommer her. :)
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