Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Do 03.06.10 11:28 
Hey,

ich würde gerne in meinem Programm verschiedene Texte mit einer Gelben besonderen schrift schreiben (siehe Dateianhang) nur wie ist das am Besten möglich diese Schrift darzustellen, falls mein erster Gedanke gut ist helft mir bitte bei der umsetzung ;D

Also

Nehmen wir an man hat ein Gitter von 64x64 genommen dass man einfach die einzelen Buchstaben herauskopiert und neu zeichnet.. Ich habe leider garkeinen Ansatz möchte aber auch keinen C&P Code haben wichtig ist auch, dass das Bild im Programm eingebunden sein soll, weil es keine Extradateien geben soll.... THX^^
Einloggen, um Attachments anzusehen!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 03.06.10 11:58 
Soweit ich weiß, benutzt Winamp auch (optional/früher mal) solche "Bitmap Schriften". Man ist dann natürlich auf diese Zeichen beschränkt, d.h. Sonderzeichen oder gar Unicode kann man dann vergessen.

Vorgehensweise ist dann die: Den String durchgehen, für jedes Zeichen die passenden Gitterkoordinaten ausrechnen, das per CopyRect (oder ähnliches) auf das Zielcanvas kopieren und dann die "Zielkoordinaten" ändern, damit das nächste Zeichen daneben gemalt wird.

Das Bild könnte als Ressorce eingebunden sein, oder etwas Quick&Dirty in einer ImageList, wobei man bei der ImageList natürlich auch die Einzelzeichen speichern könnte, was dann auch wieder Vorteile hätte. Denn dann müsste man die Einzelgrafiken nicht aus dem großen Bild rauspopeln.

_________________
We are, we were and will not be.
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Do 03.06.10 12:26 
Stimmt ich versuch das einfach mal

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Leider komme ich ganz und garnicht weiter.. Mit Grafiken habe ich mich leider noch nicht beschäftigt ;D also ich schaue wieviele Buchstaben der Text hat und rechne dann Anzahl mal 64 nur wie erstlle ich jetzt eine leere Bitmap und trage dann alle 64pix einen bestimmten Buchstaben(Bild) ein?
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 04.06.10 00:07 
Hey,

das besste is wenn du dir da ne Prozedur machst, die dir die BMP zusammen setzt. Du weißt ja die Breite eines jeden Buchstabens. und die Länge des Strings hast du auch, also muss die BMP.width := Length(str) * CHAR_WIDTH sein. Mit der Höhe is es dann ähnlich, kommt drauf an ob du Zeilenumbrüche oder sowas drin hast. Mit BMP.Canvas.CopyRect() kannst du dann bestimmte bereiche aus der BMP mit den Buchstaben in die neue BMP kopieren. (siehe Delphi-Hilfe).

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Fr 04.06.10 00:16 
Ich würde das so versuchen, dass jeder Buchstabe in einer Imagelist gespeichert ist. Könntest du eventuell ein Beispiel machen? Bei dem eine Bitmap mit Höhe 64px und Breite 2x64px erstellt wird und dann aus einer ImageList an Stelle 1 ein Bild aus ImageList1 mit index 0 und an Stelle 2 eins mit Index 1 kopiert wird? Wie schon gesagt habe ich leider keinen Ansatz ... währe nett;D thx schonma
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 04.06.10 00:44 
Hey,

ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
//schreibt die Buchstaben aus dem String in eine Bitmap
//@bmp: Bitmap in die die Bichstaben geschrieben werden;
//@str: String der in die Bitmap geschrieben werden soll;
procedure GetBitmapFontString(bmp: TBitmap; str: String);
var Font: TBitmap;
var i, x, y: Integer;
var SourceRect, DestRect: TRect;
begin
  //Font-Bitmap laden
  Font := TBitmap.Create;
  Font.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'font.bmp');

  //String auf gültige Zeichen prüfen
  str := LowerCase(str);
  i := 1;
  while i <= Length(str) do begin
    if not (str[i] in [' ','a'..'z','.','!','?','0'..'9',',',':','-','"','$','''']) then
      delete(str, i, 1)
    else
      inc(i);
  end;

  //Koordinaten des Zeichens ermitteln und in BMP kopieren
  x := 0;
  y := 0;
  bmp.Width  := Length(str) * 64;
  bmp.height := 64;
  for i := 1 to Length(str) do begin
    case str[i] of
//LEERZEICHEN
      ' 'begin
        x := 0;
        y := 0;
      end;
//BUCHSTABEN A BIS Z
      'a'..'z'begin
        x := Ord(str[i])-96//bei 'a' ist x = 1;
        y := 0;
        while x > 15 do begin
          dec(x, 16);
          inc(y);
        end;
      end;
//PUNKT
      '.'begin
        x := 11;
        y :=  1;
      end;
//AUSRUFEZEICHEN
      '!'begin
        x := 12;
        y :=  1;
      end;
//FAGEZEICHEN
      '?'begin
        x := 12;
        y :=  1;
      end;
//ZIFFER 0
      '0'begin
        x := 7;
        y := 2;
      end;
//ZIFFERN 1 BIS 9
      '1'..'9'begin
        x := Ord(str[i])-35//bei '1' ist x = 14;
        y := 0;
        while x > 15 do begin
          dec(x, 16);
          inc(y);
        end;
      end;
//KOMMA
      ','begin
        x := 8;
        y := 2;
      end;
//DOPPELPUNKT
      ':'begin
        x := 9;
        y := 2;
      end;
//MINUS/BINDESTRICH
      '-'begin
        x := 10;
        y :=  2;
      end;
//ANFÜHRUNGSZEICHEN
      '"'begin
        x := 11;
        y :=  2;
      end;
//DOLLARZEICHEN
      '$'begin
        x := 12;
        y :=  2;
      end;
//HOCHKOMMA
      ''''begin
        x := 13;
        y :=  2;
      end;
    end;

    //Zeichen in Bitmap kopieren
    SourceRect := Rect(   X * 64, Y * 64, (X+1)* 64, (Y+1) * 64);
    DestRect   := Rect((i-1)* 64,      0,    i * 64,         64);
    bmp.Canvas.CopyRect(DestRect, font.Canvas, SourceRect);
  end;

  //Font freigeben
  Font.Free;
end;


MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Fr 04.06.10 01:15 
Vielen Dank erstmal ;D ich hab leider nur diesen Teil nicht verstanden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  //Zeichen in Bitmap kopieren
    SourceRect := Rect(   X * 64, Y * 64, (X+1)* 64, (Y+1) * 64);
    DestRect   := Rect((i-1)* 64,      0,    i * 64,         64);
    bmp.Canvas.CopyRect(DestRect, font.Canvas, SourceRect);
  end;

1. Was ist TRect?
2. Ich weiß auch nicht was CpbyRect für Parameter erwartet und wie der geht xD

Also was ist dann in SourceRect und was in DestRect

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 04.06.10 01:18 
gibt mal hier TRect und CopyRect ein. ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 04.06.10 01:21 
Hey,

TRect definiert ein Rechteck, aus dem dann die Daten kopiert werden. Die Parameter für CopyRect sind (Zielrechteck, QuellCanvas, Quellrechteck). Also kopiert CopyRect alles was in SourceRect ist, von der SourceCanvas auf die Canvas des Objekts welches CopyRect aufruft, in den Breich von DestRect. Das hättest du aber auch ganz einfach in der Hilfe nachlesen können, dazu ist sie da! Also bitte in Zukunft erstmal bisl Eigeninitiative zeigen, denn es ist nich der Sinn der Sache das wir dir alles machen. Wenn du dir das selber erarbeitest beleibts wenigstens im Kopf :mahn: ;)

Mfg Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Fr 04.06.10 01:25 
Danke Bergmann ich habs verstanden :P

EDIT// Wenn ich jetzt jeden Buchstaben einzeln in einer Imagelist hab geht ja CopyRect nichtmehr^^ wie "male" ich dann das ganze Bild in die Bitmap?
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 04.06.10 01:37 
canvas.Draw mehr verrat ich jetzt mal nicht ;) Und CopyRect würde auch noch gehen, musst halt das Rect so groß wie die Canvas machen...

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Fr 04.06.10 08:24 
Okay vielen Dank hab es hinbekommen und sry dass ihr soviel schreiben musstet ich hatte einfach keine Ahnung
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 04.06.10 18:20 
Kein Problem, dazu is das Forum ja da. Aber wie gesagt: Selbst ist der Mann ;)

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^