Avatar billede Slettet bruger
08. juli 2001 - 18:20 Der er 16 kommentarer og
2 løsninger

Generering af GIF knap.

Hey.

Jeg har brug for et par gode råd ...

Jeg skal (så hurtigt som muligt) lave et lille Java program, der kan generere en GIF med en true type tekst på.
Mere præcist: Programmet skal som argument modtage en String (teksten på knappen), der skal genereres en transparent GIF (eller blot læses en transparent GIF), og teksten skal skrives på GIF\'en med en true type font (ingen antialias eller noget). Den producerede GIF skal gemmes på disken.

Hvordan griber jeg dette an?
Avatar billede lbhansen Nybegynder
08. juli 2001 - 18:56 #1
Du laver dit billede på et BufferedImage, hvor du skriver teksten o.lign.

Så kan du bruge gifcreatoren fra http://www.acme.com/java/software/

Min anbefalede løsning er at lave et png billede istedet, da der er licens på gif formatet.
Avatar billede Slettet bruger
08. juli 2001 - 18:59 #2
Kan du vise mig et eksempel på, hvordan man genererer det BufferedImage (med transparent baggrund), og skriver på det med en true type font?

GIF encoderen sætter jeg mig så lige ind i :)
Avatar billede delbing Nybegynder
08. juli 2001 - 19:07 #3
gå til www.acme.com og download Acme.JPM.Encoders.GifEncoder.

Følgende kunne virke. Jeg er ikke helt sikker på om det bliver transparent. Hvis ikke skal der nok tegnes en gennemsigtig baggrund - en Color kan gøres gennemsigtig vha. Transparency interfacet, som Color implementerer.

// dine variable
int width; // i pixels
int height; // i pixels
int x; // placering
int y; // placering
String text;
Font myFont;
File outFile;


OutputStream out = null;
Graphics g = null;
Frame frame = null;

try {
out = new FileOutputStream(outFile);
frame = new Frame();
frame.addNotify();
Image image = frame.createImage(width, height);
g = image.getGraphics();
g.setFont(myFont);
g.drawString(text, x, y);
GifEncoder encoder = new GifEncoder(image, out);
encoder.encode();
}
finally {
// ryd op
if (g!=null) g.dispose();
if (frame!=null) frame.removeNotify();
if (out!=null) out.close();
}
Avatar billede delbing Nybegynder
08. juli 2001 - 19:10 #4
Ovenstående er JDK 1.1 kompatibelt - BufferedImage, som ibhansen foreslog, er nok nemmere til at lave billedet med, men det kom først i JDK 1.2
Avatar billede delbing Nybegynder
08. juli 2001 - 19:13 #5
Acme encoderen bruger LZ kompression, som ikke er beskyttet af et patent. Det er en gråzone om LZ kompression også er omfattet af patenterne på LZW kompression.
Avatar billede lbhansen Nybegynder
08. juli 2001 - 19:28 #6
sådan som jeg læser følgende skriv:http://www.cpe.surrey.ac.uk/support/faq/gif_lzw.htm

Så skal der ikke rekvireres en licens til LZW compression hvis det er non-profit, eller skal man igennem compuserve erhverve en licens
Avatar billede Slettet bruger
08. juli 2001 - 19:31 #7
Oki, mangler bare to ting nu så ...

Der skal nok tegnes en transparent firkant med fillRectangle() eller såen. Hvordan får jeg den farve transparent?

Hvordan sætter jeg fonten til en truetype font (Verdana)? Og skal den skrifttype så bare ligge i samme katalog som .java filen eller?
Avatar billede lbhansen Nybegynder
08. juli 2001 - 19:43 #8
for at ændre fonten, skal du følge dette skriv:
http://www.doc.ic.ac.uk/lab/cplus/java/jdk/guide/intl/fontprop.html#win32

Jeg har ikke lige kigget på at lave en transparant farve, jeg havde håbet at det hjalp at sætte alpha værdien til 255, men det virkede ikke lige
Avatar billede lbhansen Nybegynder
08. juli 2001 - 19:46 #9
Hvis du er heldig, kan du nøjes med at tilføje:
filename.Verdana=Verdana.TTF

Til din font.properties i /jre/lib/
Avatar billede Slettet bruger
08. juli 2001 - 19:55 #10
Når jeg sætter fonten i koden, skal jeg så gøre noget ala:

Font font = new Font(\"Verdana\", Font.TRUETYPE_FONT, 12); ?!

Det er vigtigt, vigtigt og vigtigt at den baggrund bliver transparent !
Avatar billede delbing Nybegynder
08. juli 2001 - 19:56 #11
prøv at se om værdien af
Color.getTransparency() == Color.OPAQUE
er true, for så ignorerer den alpha-værdien. Skal alpha forresten ikke være 0 for at være gennemsigtig?
Avatar billede lbhansen Nybegynder
08. juli 2001 - 19:56 #12
ja, det giver meget mening.

Hvis den skal være transparant, så er det jo bare at eksperimentere lidt selv, og surfe nettet tyndt
Avatar billede lbhansen Nybegynder
08. juli 2001 - 20:01 #13
delbing >> jo det skal den forresten også være. Jeg prøvede lige at sætte den til 0, men det virkede heller ikke
Avatar billede Slettet bruger
08. juli 2001 - 20:40 #14
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import Transparency;
import Acme.JPM.Encoders.GifEncoder;

public class buttonGenerator {
    private static final int WIDTH = 50;
    private static final int HEIGHT = 50;
    private static final int FONT_OFFSET_X = 10;
    private static final int FONT_OFFSET_Y = 10;

    public static void main(String args[]) {
        Transparency t = new Transparency();
        OutputStream out = null;
        String text = \"\";
        Frame frame = null;
        Graphics g = null;
        try {
            File outfile = new File(\"D:/Java/some.gif\");
            out = new FileOutputStream(outfile);
        } catch (Exception e) { System.out.println(\"FileOutputStream error\"); }
        try {
            //text = args[0];
            text = \"test\";
        } catch (Exception e) { System.out.println(\"Missing argument\"); }
            frame = new Frame();
            frame.addNotify();
            Image image = frame.createImage(WIDTH, HEIGHT);
            g = image.getGraphics();
            g.setColor(Color.black);
            g.fillRect(0, 0, WIDTH, HEIGHT);
            g.setColor(Color.blue);
            g.drawString(text, FONT_OFFSET_X, FONT_OFFSET_Y);
            Font font = new Font(\"Verdana\", Font.TRUETYPE_FONT, 12);
            image = t.makeColorTransparent(image, Color.black);
        try {
            GifEncoder encoder = new GifEncoder(image, out);
            encoder.encode();
        } catch (Exception e) { System.out.println(\"GIF encoding failed\"); }
        g.dispose();
        frame.removeNotify();
        try {
            out.close();
        } catch (Exception e) { System.out.println(\"Couldnt close stream\"); }
        System.exit(0);
    }
}

Her er så resultatet so far. Jeg fandt Transparency.class, som tilsyneladende fungerer fint. Det der er lidt ubehageligt er, at programmet ikke lukker med mindre jeg har den System.exit(0), hvordan mon det kan være?

Jeg har testet at det ikke har noget med Transparency tingene at gøre. Det er efter jeg brugte Frame istedet for bufferedImage.
Avatar billede lbhansen Nybegynder
08. juli 2001 - 20:45 #15
det er måden at komme ud på programmet når du holder dig til awt. Så det er der ikke noget galt i. hvis du bruger swing, så har du mulighed for at sætte default close operation.
Avatar billede Slettet bruger
08. juli 2001 - 20:48 #16
Så det er fint nok bare at bruge System.exit(0) her?
Avatar billede lbhansen Nybegynder
08. juli 2001 - 20:49 #17
ja, det gør jeg selv altid når jeg skal lave applikationer der skal holde sig til anvendelse af awt
Avatar billede Slettet bruger
08. juli 2001 - 20:50 #18
Oki virkede bare brutalt.

Tak for den gode hjælp til jer begge!
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