Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Auf ein Image schreiben (https://www.delphipraxis.net/17744-auf-ein-image-schreiben.html)

dedeur 9. Mär 2004 11:35


Auf ein Image schreiben
 
hallo NG

ich öffne auf einem Image ein bmp. dies möchte ich nun nachträglich etwas drauf schreiben.

hat jemand tipps

mfg

Sanchez 9. Mär 2004 11:42

Re: Auf ein Image schreiben
 
Hallo,

Einfach das Bitmap in ein TBitmap laden. Dann hast du einen Canvas und kannst nach herzenslust drauf schreiben, zeichnen, ...
Dann wieder speichern

grüße, daniel

[EDIT]Hab grad gelesen, dass du es in einem TImage hast.
Dort kannst du genauso auf den Canvas zugreifen.

Delphi-Quellcode:
  image.Picture.Bitmap.Canvas.TextOut(x, y, text);
[/EDIT]

sakura 9. Mär 2004 11:43

Re: Auf ein Image schreiben
 
Zauberwort: Hier im Forum suchenDrawText

...:cat:...

dedeur 9. Mär 2004 11:58

Re: Auf ein Image schreiben
 
procedure TForm1.Button7Click(Sender: TObject);
var

begin
Image1.Picture.Bitmap.Canvas.TextOut(x , y, text);

end;

hab folgende fehler erhalten:

[Fehler] UNIT1.PAS(153): Bezeichner erwartet, aber 'BEGIN' gefunden
[Fehler] UNIT1.PAS(154): Undefinierter Bezeichner: 'x'
[Fataler Fehler] project1.dpr(5): Verwendete Unit 'UNIT1.PAS' kann nicht compiliert werden

ich erst den button click und dan erlauben auf der bmp zu schreiben.
ich bin noch nicht solange dabei mit delphi7 kann mir nochmal geholfen werden :?:
vielen dank im vorraus

Matze 9. Mär 2004 12:01

Re: Auf ein Image schreiben
 
Lass das var weg und gibt anstelle von x und y die Koordinaten an.

Sanchez 9. Mär 2004 12:04

Re: Auf ein Image schreiben
 
Zitat:

Zitat von dedeur
[Fehler] UNIT1.PAS(153): Bezeichner erwartet, aber 'BEGIN' gefunden

Grund: du hast zwischen var und begin keine Variablen definiert

Zitat:

Zitat von dedeur
[Fehler] UNIT1.PAS(154): Undefinierter Bezeichner: 'x'

Grund: x, y und text sollte dir nur zeigen, was die Parameter bedeuten.

So soll es aussehen:

Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.Canvas.TextOut(10 , 10, 'Ich bein eine Bildbeschriftung');
end;
Das schreibt dir den Text bei den Koordinaten 10,10.
Zum speichern des Bildes nimmst du:

Delphi-Quellcode:
  Image1.Picture.Bitmap.SaveToFile(DateiName);
grüße, daniel

dedeur 9. Mär 2004 12:39

Re: Auf ein Image schreiben
 
hat mir schon weitergeholfen ich will aber den text erst auf der bmp schreiben

und am besten wär wenn ich per mausklick bestimme wo der text erscheint

gruß
patrick

Sanchez 9. Mär 2004 13:31

Re: Auf ein Image schreiben
 
Hallo,

Am einfachsten wäre wohl, wenn ein Edit hast in das du zuerst den Text eingibst, einen Button (einen Speedbutton kannst du einrasten lassen) um in den "Text-am-Bild-platzieren-Modus" zu schalten.

Im ButtonClick sagst du dann:

Delphi-Quellcode:
  FTextPickMode := not FTextPickmode and (edText.Text <> '');
Wobei FTextPickMode ein boolean ist, dass du in der Klasse definieren musst.

Im OnMouseDown vom Image:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FPickMode then begin
    Image1.Picture.Bitmap.Canvas.TextOut(x , y, edText.Text);  
  end;
end;
Wenn du den Text direkt am Bild eintippen willst, dann wirds schon etwas komplizierter.
Am einfachsten ist es vermutlich ein Edit dort zu erzeugen, wo du den Text platzierst.

Dafür könntest du in der Klasse ein TEdit FTempEdit definieren.

Im OnMouseDown vom Image:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FPickMode then begin
   FTempEdit := TEdit.Create(self);
   FTempEdit.Parent := Image1;
   FTempEdit.OnExit := EditOnExit;
  end;
end;

procedure TForm1.EditOnExit(Sender : TObject);
begin
  Image1.Picture.Bitmap.Canvas.TextOut(FTempEdit.Left , FTempEdit.Top, FTempEdit.Text);    
  FreeAndNil(FTempEdit);
end;
Das hab ich jetzt ohne testen mal hingetippt. Kann sein dass ich noch etwas vergessen hab.

grüße, daniel

dedeur 9. Mär 2004 13:48

Re: Auf ein Image schreiben
 
hallo
habe folgendes eingehagt er compeliert auch, aber wenn ich im edit1 feld etwas reinschreibe und denn button klick tut sich nichts.
muss mal ein lob an euch aussprechen ihr seid eine echte Hilfe auch wenns noch nit klappt :thuimb:

Code:

procedure TForm1.Button1Click(Sender: TObject);
begin
FTextPickMode := not FTextPickmode and (edit1.Text <> '');

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if FPickMode then begin
    Image1.Picture.Bitmap.Canvas.TextOut(x , y, edit1.Text);

end;
end;
end.

Sanchez 9. Mär 2004 13:48

Re: Auf ein Image schreiben
 
Mir kommt gerade so der Gedanke, dass es weniger schlau ist, das Edit im OnExit freizugeben.
Eventuell isses besser, wenn du gleich ein Edit auf das Formular ziehst und es invisible setzt.

Wo ich es im Source vorher erzeugt hätte, setzt du es Visible und setzt die Position.
Wo ich es zerstört hätte setzt du es wieder unsichtbar.

Sanchez 9. Mär 2004 13:57

Re: Auf ein Image schreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal eben sowas in die Richtung gemacht.
Findest im Anhang.

dedeur 9. Mär 2004 16:18

Re: Auf ein Image schreiben
 
hallo NG,

ich will jetzt noch den Text Größer haben den ich auf der BMP erstelle hab es hiermit versucht zeigt aber keine wirkung:

:coder:
Code:
procedure TForm1.edTextKeyPress(Sender: TObject; var Key: Char);
begin
  edText.Font.Size := 20;
end;
und hiermit beides leider nicht zum gewünschtem erfolg geführt:
:coder:
Code:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FTextMode then begin
    edText.Left := X + Image1.Left;
    edText.Top := Y + Image1.Top;
    edText.Visible := true;
    edText.AutoSize := true;
    edText.Text := '';
    edText.Font.Size := 20;       :!: darum gehts
    FTextMode  := false;
    btText.Down := false;
  end else begin
    Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top,
      edText.Text);
    edText.Visible := false;
  end;
kann jemand helfen ich glaub ich bin etwas :cyclops: und find den fehler nicht

Markus K. 9. Mär 2004 16:46

Re: Auf ein Image schreiben
 
Hallo dedeur,
wiefolgt müsstest du den Text vergrößern können.
Delphi-Quellcode:
with Image1.Picture.Bitmap.Canvas do
begin
     Font.Size:={Größe einsetzen};
     TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top, edText.Text);
end;
Tschüß Markus

dedeur 9. Mär 2004 16:50

Re: Auf ein Image schreiben
 
@Markus

in welcher procedure :?:

Markus K. 9. Mär 2004 16:55

Re: Auf ein Image schreiben
 
Du musst es in der Prozedur TForm1.Image1MouseDown anstelle von
Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top, edText.Text); einfügen.

Tschüß Markus

[edit=sakura] Mehrfachposts gelöscht ;) Mfg, sakura[/edit]

dedeur 9. Mär 2004 17:00

Re: Auf ein Image schreiben
 
so hab ich s gemacht

procedure TForm1.Image1MouseDown(Sender: TObject; Button:
Code:
TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FTextMode then begin
    edText.Left := X + Image1.Left;
    edText.Top := Y + Image1.Top;
    edText.Visible := true;
    edText.AutoSize := true;
    edText.Text := '';
    edText.Color := clRed;
    edText.Font.Size := 20;
    FTextMode  := false;
    btText.Down := false;

  end else begin
        Font.Size := 20;
    Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top,
      edText.Text,);

    edText.Visible := false;
  end;

end;
komischerweise verändert er die schrift des Buttons und nicht was ich schreibe :wall:

Sanchez 9. Mär 2004 17:24

Re: Auf ein Image schreiben
 
Zitat:

Zitat von dedeur
so hab ich s gemacht

procedure TForm1.Image1MouseDown(Sender: TObject; Button:
Code:
TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FTextMode then begin
    edText.Left := X + Image1.Left;
    edText.Top := Y + Image1.Top;
    edText.Visible := true;
    edText.AutoSize := true;
    edText.Text := '';
    edText.Color := clRed;
    edText.Font.Size := 20;
    FTextMode  := false;
    btText.Down := false;

  end else begin
        Font.Size := 20;
    Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top,
      edText.Text,);

    edText.Visible := false;
  end;

end;

Im else-Zweig musst du
Delphi-Quellcode:
  Image1.Picture.Bitmap.Canvas.Font.Size := 20;
anstatt
Delphi-Quellcode:
  Font.Size := 20;
Du könntest allerdings auch einen Font-Dialog verwenden und dann einfach den Font zuweisen, wenn der Dialog ausgeführt wurde.
Wie das geht solltest du problemlos in der OH oder hier finden.

grüße, daniel

dedeur 11. Mär 2004 11:09

Re: Auf ein Image schreiben
 
:coder: :coder: :coder:
Code:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FTextMode then begin
    edText.Left := X + Image1.Left;
    edText.Top := Y + Image1.Top;
    edText.Visible := true;
    edText.AutoSize := true;
    edText.Text := '';
    Image1.Picture.Bitmap.Canvas.Font.Size := 24;
    //Image1.Picture.Bitmap.Canvas.Font.Color := clblue;

   // edText.Color := clGreen;
    FTextMode  := false;
//    btText.Down := false;

  end else begin

    Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top,
      edText.Text,);


    edText.Visible := false;
  end;
klappt alles wunder bar, ich will jetzt aber noch den Schriftart verändern den ich aus einem edit Feld ja auf das Image lade
ich mache folgendes: :coder:
Code:
procedure TForm1.Schriftart1Click(Sender: TObject);
begin
  if FontDialog1.Execute then edText.Font := FontDialog1.Font;
end;
Er ändert aber nur im Edit feld die Schriftart nicht aber wenn ich sie Überge.
hat jemand rat wie ich die veränderte Schriftart übergeben kann :?:

Sanchez 11. Mär 2004 11:31

Re: Auf ein Image schreiben
 
Hi,

Du meinst vermutlich, dass du die Schriftart auch am Bild dann haben willst, oder?

Delphi-Quellcode:
procedure TForm1.Schriftart1Click(Sender: TObject);
begin
  if FontDialog1.Execute then begin
    edText.Font := FontDialog1.Font;
    Image1.Picture.Bitmap.Canvas.Font := FontDialog1.Font;
  end;
end;
BTW: Würde ich beim anzeigen des Edits auch gleich den Fokus reinsetzen (mit edText.SetFocus;)

grüße, daniel

dedeur 11. Mär 2004 13:54

Re: Auf ein Image schreiben
 
Damit hat es geklappt: :coder:
Code:
Image1.Picture.Bitmap.Canvas.Font := FontDialog1.Font;
bin sogar selber drauf gekommen :lol:

Jetzt will ich aber das der Hintergrund die farbe beibehält, weil die weiße Hintergrundfarbe nicht dahin soll sondern nur der TEXT aufs Image soll
Fummel gerade mit dem :arrow: SetBkColor(TransparentColor); versucht klappt aber irgendwie noch nicht :(


Viele Grüße an Daniel der hier sehr kooperativ aushilft Vielen dank :thuimb:

Sanchez 11. Mär 2004 14:22

Re: Auf ein Image schreiben
 
Hallo,

So schaltest du die Hintergrundfarbe des Textes auf transparent:

Delphi-Quellcode:
  SetBkMode(Image1.Picture.Bitmap.Canvas.Handle, TRANSPARENT);
grüße, daniel

dedeur 11. Mär 2004 14:29

Re: Auf ein Image schreiben
 
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FTextMode then begin
    edText.Left := X + Image1.Left;
    edText.Top := Y + Image1.Top;
    edText.Visible := true;
    edText.AutoSize := true;
    edText.Text := '';
// Die gewünschten Einstellungen aus dem FontDiag werden in den TEXT übernommen
    Image1.Picture.Bitmap.Canvas.Font := FontDialog1.Font;
    SetBkMode(Image1.Picture.Bitmap.Canvas.Handle, TRANSPARENT);
    FTextMode  := false;
  end else begin
    Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top,
    edText.Text,);
    edText.Visible := false;
  end;
hab es mal so übernommen er führt auch aus jedoch ist der Hintergrund immer noch weiß :gruebel:

Sanchez 11. Mär 2004 14:47

Re: Auf ein Image schreiben
 
Ersetz das SetBkMode mal durch
Delphi-Quellcode:
  Image1.Picture.Bitmap.Canvas.Brush.Style := bsClear;
Es reicht allerdings, wenn du diese Zuweisung im OnShow machst.

Ist aber eigenartig. Ich hab mal ein Projekt gemacht, wo es mit SetBKMode funktioniert hat.
Jetzt hab ich aber das aber bei meinen Anhang von Vorgestern versucht und da hats auch net geklappt :gruebel:

dedeur 11. Mär 2004 15:06

Re: Auf ein Image schreiben
 
Hervorragend wär ich heute nicht mehr drauf gekommen.

Wollt jetzt mal versuchen den Text immer in der Mitte des Bitmaps auszugeben...

muß ich da mit Position := poScreenCenter;

arbeiten :?:


Gruß Patrick

Sanchez 11. Mär 2004 15:14

Re: Auf ein Image schreiben
 
Nö,
du musst doch einfach die Koordinaten beim TextOut anders setzen.
Einfach die Mitte vom Bild nehmen und die Text-Abmessungen abziehen.
Stichwort: Canvas.TextExtend

Die Position := poScreencenter lässt das Fenster immer in der Mitte des Screens auftauchen.

grüße, daniel

dedeur 11. Mär 2004 15:37

Re: Auf ein Image schreiben
 
Du meinst ich muss diese Zeile:

Code:
Image1.Picture.Bitmap.Canvas.TextOut(edText.Left - Image1.Left , edText.Top - Image1.Top, edText.Text,);
abändern?
Ich versteh das mit dem Canvas.TextExtent noch nicht so ganz :stupid:
was macht das den?

Ich hab jetzt vermutet ich muss hinter dem Left und Top genaue Koordinaten angeben...

Sanchez 11. Mär 2004 15:45

Re: Auf ein Image schreiben
 
Mit

Delphi-Quellcode:
  Image1.Picture.Bitmap.Canvas.TextOut(Image1.Width div 2 , Image1.Height div 2, edText.Text);
fängt der Text in der Mitte an.

TextExtent liefert dir die Abmessung des Strings. Die kannst du dann noch Abziehen.

Delphi-Quellcode:
  TextSize := Image1.Picture.Bitmap.Canvas.TextExtend(edText.Text);
  Image1.Picture.Bitmap.Canvas.TextOut((Image1.Width - TextSize.cx) div 2, (Image1.Height - TextSize.cy) div 2, edText.Text);
grüße, daniel

dedeur 11. Mär 2004 16:10

Re: Auf ein Image schreiben
 
Der
Code:
Image1.Picture.Bitmap.Canvas.TextOut(Image1.Width div 2 , Image1.Height div 2, edText.Text);
funzt super.

mit dem hab ich so meine Probleme

Code:
TextSize := Image1.Picture.Bitmap.Canvas.TextExtend(edText.Text);
    Image1.Picture.Bitmap.Canvas.TextOut((Image1.Width - TextSize.cx) div 2, (Image1.Height - TextSize.cy) div 2, edText.Text);
er gibt mir den Fehler
Delphi-Quellcode:
 [Fehler] Main.pas(81): Undefinierter Bezeichner: 'TextSize'
 [Fehler] Main.pas(81): Undefinierter Bezeichner: 'TextExtend'
 [Fehler] Main.pas(82): ')' erwartet, aber Bezeichner 'cx' gefunden
zurück.
hab versucht in der procedure eine Variable TextSIze angelgt als String... var TextSize : String;

der erste FEhler ist dann weg die andern bleiben bestehen.

Sanchez 11. Mär 2004 16:25

Re: Auf ein Image schreiben
 
Sorry mein Fehler.
Es heißt TextExtent und Textsize ist vom Type TSize.
Mit der OH (F1) hättest du das schneller rausgefunden.

grüße, daniel

Darklanmaster 7. Apr 2004 23:52

Re: Auf ein Image schreiben
 
ich hab auch noch ne frage!

ähhm ihr erzeugt ja so nur Bitmap Bilder. Gibs das auch für JPG bilder?
weil ich hab vor das bild per ftp ins internet hochzuladen. und BMP is mir zu groß.
Weiß jemand rat? :gruebel:

MFG
D@rklanmaster

Luckie 7. Apr 2004 23:56

Re: Auf ein Image schreiben
 
Neue Frage, neuer Thread bitte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz