![]() |
Re: Grafik als screenshot
Willst du selber was programmieren oder andere was programmieren lassen? :D
Also am einfachsten machst du dir ein zweites bitmap im speicher, auf dem jedes bundesland eine andere farbe hat. dann fragst du ab, welche farbe dieses bitmap an der mausposition hat und gibst den namen aus, der dieser farbe zugeornet ist. nach dem motto case speicherbitmap.canvas.pixels[mausposition.x,mausposition.y] of clred: label1.caption := 'Bayern'; clblue: label1.caption := 'hessen'; cllime: label1.caption := 'Rheinland-Pfalz'; ... end; zugegeben nicht gerade optimal... |
Re: Grafik als screenshot
Gute Idee, aber die Flächen der Bundesländer sind bereits farbig, je nach der stärlsten Fraktion der Wahl
Insofern geht es so nicht gruß |
Re: Grafik als screenshot
Zitat:
Delphi-Quellcode:
Bis auf die Farben, sollten beide Bilder, also stärkste Fraktionen und farbige Bundesländer aber identisch sein.
private
BildBundeslaender: TBitmap; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var Pfad: AnsiString; begin BildBundeslaender:= TBitmap.Create; Pfad:= 'FarbigeBundesländer.bmp'; if FileExists(Pfad) then BildBundeslaender.LoadFromFile(Pfad); end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin label1.caption:= ''; if (X <= BildBundeslaender.Width) and (Y <= BildBundeslaender.Height) then case BildBundeslaender.canvas.pixels[X, Y] of clred: label1.caption := 'Bayern'; clblue: label1.caption := 'hessen'; cllime: label1.caption := 'Rheinland-Pfalz'; //... end; end; procedure TForm1.FormDestroy(Sender: TObject); begin BildBundeslaender.Free; end; |
Re: Grafik als screenshot
Das klappt bei mir noch nicht nach beiden Seiten.
Mit dem folgenden Zeilen werden die Bundesländer zwar unterschiedlich gefärbt, speichere ich sie ab, erhalte ich nur einen schwarz-weiße Kopie. Mit der schwarz-weiß-Kopie komme ich nicht zum Anzeigen der Ländernamen (als Doublette im Speicher).
Delphi-Quellcode:
[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type Tform1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure fromshow(sender:TObject); procedure paintbox1paint(sender:TObject); procedure einfaerben(sender:TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var form1: Tform1; var bitmap1:tbitmap; implementation {$R *.dfm} procedure tform1.fromshow(sender:TObject); begin form1.Width:=7*screen.Width DIV 8; form1.Height:=19*screen.Height div 20; form1.Left:=(screen.Width-form1.Width) DIV 2; form1.Top:=(screen.Height-form1.Height) div 2; paintbox1.Height:=645; paintbox1.width:=486; paintbox1.Left:=(form1.Width-paintbox1.Width) div 2; paintbox1.Top:=(form1.Height-paintbox1.Height) div 2; paintbox1paint(sender); end; procedure tform1. paintbox1paint(sender:TObject); begin Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('laender.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); // Bitmap1.Free; einfaerben(sender); end; procedure tform1.einfaerben(sender:TObject); Var farbe:tcolor; x,y:integer; begin with canvas do with paintbox1 do begin brush.color:= clbackground; //NRW farbe:= pixels[X,Y]; floodfill(paintbox1.Left+120,paintbox1.Top+260,farbe, fsborder); brush.color:= clskyblue; //RHPf farbe:= pixels[X,Y]; floodfill(paintbox1.Left+80,paintbox1.Top+400,farbe, fsborder); brush.color:= clblack; //Nieders farbe:= pixels[X,Y]; floodfill(paintbox1.Left+170,paintbox1.Top+150,farbe, fsborder); brush.color:= clred; //Hessen farbe:= pixels[X,Y]; floodfill(paintbox1.Left+130,paintbox1.Top+390,farbe, fsborder); brush.color:= clfuchsia; //BaWü farbe:= pixels[X,Y]; floodfill(paintbox1.Left+230,paintbox1.Top+500,farbe, fsborder); brush.color:= clmaroon; //Bayern farbe:= pixels[X,Y]; floodfill(paintbox1.Left+260,paintbox1.Top+450,farbe, fsborder); brush.color:=clgreen; //Saarland farbe:= pixels[X,Y]; floodfill(paintbox1.Left+60,paintbox1.Top+460,farbe, fsborder); brush.color:= claqua; //Schl.Holstein farbe:= pixels[X,Y]; floodfill(paintbox1.Left+200,paintbox1.Top+90,farbe, fsborder); brush.color:= clmoneygreen; //Bremen farbe:= pixels[X,Y]; floodfill(paintbox1.Left+154,paintbox1.Top+160,farbe, fsborder); floodfill(paintbox1.Left+150,paintbox1.Top+124,farbe, fsborder); brush.color:= clmedgray; //Mecklenburg Vorpomm farbe:= pixels[X,Y]; floodfill(paintbox1.Left+289,paintbox1.Top+150,farbe, fsborder); brush.color:= clappworkspace; //Brandenburg farbe:= pixels[X,Y]; floodfill(paintbox1.Left+350,paintbox1.Top+200,farbe, fsborder); brush.color:= clhotlight; //SachsenAnhalt farbe:= pixels[X,Y]; floodfill(paintbox1.Left+370,paintbox1.Top+370,farbe, fsborder); brush.color:= clyellow; //Sachsen farbe:= pixels[X,Y]; floodfill(paintbox1.Left+270,paintbox1.Top+270,farbe, fsborder); brush.color:= clpurple; //Thüringen farbe:= pixels[X,Y]; floodfill(paintbox1.Left+250,paintbox1.Top+320,farbe, fsborder); brush.color:= clolive; //Berlin farbe:= pixels[X,Y]; floodfill(paintbox1.Left+385,paintbox1.Top+200,farbe, fsborder); brush.color:= cllime; //Hamburg farbe:= pixels[X,Y]; floodfill(paintbox1.Left+220,paintbox1.Top+115,farbe, fsborder); end; end; procedure Tform1.Button2Click(Sender: TObject); begin Bitmap1.Canvas.CopyRect(Rect(0, 0, Bitmap1.Width, Bitmap1.Height), PaintBox1.Canvas, Rect(0, 0, Bitmap1.Width, Bitmap1.Height)); Bitmap1.SaveToFile('B.bmp');//wird jetzt überschrieben! bitmap1.free; end; procedure Tform1.Button1Click(Sender: TObject); begin form1.close; end; end. |
Re: Grafik als screenshot
Hallo,
hier ist ein Ausschnitt aus deinem Code:
Delphi-Quellcode:
Also jedes mal wenn das Ereignis onPaint der Paintbox ausgelöst wird, lädst du das Bild nach meiner Ansicht immer wieder neu. Also den Code da oben würde ich löschen und dafür folgenden Code hinzufügen:
procedure tform1. paintbox1paint(sender:TObject);
begin Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('laender.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); // Bitmap1.Free; einfaerben(sender); end;
Delphi-Quellcode:
Also einen Button hinzufügen und damit das Bild laden und nicht mit onPaint.
procedure TForm1.Button1Click(Sender: TObject);
begin Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('laender.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); einfaerben(sender); end; Folgendes ist mir auch noch aufgefallen, wieder Code von dir:
Delphi-Quellcode:
Mit with canvas do zeichnest du auf den Canvas deiner Form und nicht auf die Paintbox, aber das kann natürlich von dir auch gewollt sein.procedure tform1.einfaerben(sender:TObject); Var farbe:tcolor; x,y:integer; begin with canvas do with paintbox1 do begin Ob damit das Problem gelöst ist, weis ich allerdings nicht. |
Re: Grafik als screenshot
Es klappt immer noch nicht;
ich habe den quellcode minimal verändert, rufe paintbox nur direkt auf und erhalte beim Speichern nur einen schwarz weiße Kopie, obwohl die BRD zunächst farbig markiert wurde. Liegt es an canvas-paintbox?? Hier noch einmal der quellcoe:
Delphi-Quellcode:
[edit=Jelly]Nächstes mal die Code-Tags bitte selbs einfügen Mfg, Jelly[/edit]
var
form1: Tform1; var bitmap1:tbitmap; implementation {$R *.dfm} procedure tform1.fromshow(sender:TObject); begin form1.Width:=7*screen.Width DIV 8; form1.Height:=19*screen.Height div 20; form1.Left:=(screen.Width-form1.Width) DIV 2; form1.Top:=(screen.Height-form1.Height) div 2; paintbox1.Height:=645; paintbox1.width:=486; paintbox1.Left:=(form1.Width-paintbox1.Width) div 2; paintbox1.Top:=(form1.Height-paintbox1.Height) div 2; paintbox1paint(sender); end; procedure tform1. paintbox1paint(sender:TObject); begin Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('laender.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); // Bitmap1.Free; einfaerben(sender); end; procedure tform1.einfaerben(sender:TObject); begin with canvas do // with paintbox1 do begin brush.color:= clbackground; //NRW floodfill(paintbox1.Left+120,paintbox1.Top+260,clblack, fsborder); brush.color:= clskyblue; //RHPf floodfill(paintbox1.Left+80,paintbox1.Top+400,clblack, fsborder); brush.color:= clblack; //Nieders floodfill(paintbox1.Left+170,paintbox1.Top+150,clblack, fsborder); brush.color:= clred; //Hessen floodfill(paintbox1.Left+130,paintbox1.Top+390,clblack, fsborder); brush.color:= clfuchsia; //BaWü floodfill(paintbox1.Left+230,paintbox1.Top+500,clblack, fsborder); brush.color:= clmaroon; //Bayern floodfill(paintbox1.Left+260,paintbox1.Top+450,clblack, fsborder); brush.color:=clgreen; //Saarland floodfill(paintbox1.Left+60,paintbox1.Top+460,clblack, fsborder); brush.color:= claqua; //Schl.Holstein floodfill(paintbox1.Left+200,paintbox1.Top+90,clblack, fsborder); brush.color:= clmoneygreen; //Bremen floodfill(paintbox1.Left+154,paintbox1.Top+160,clblack, fsborder); floodfill(paintbox1.Left+150,paintbox1.Top+124,clblack, fsborder); brush.color:= clmedgray; //Mecklenburg Vorpomm floodfill(paintbox1.Left+289,paintbox1.Top+150,clblack, fsborder); brush.color:= clappworkspace; //Brandenburg floodfill(paintbox1.Left+350,paintbox1.Top+200,clblack, fsborder); brush.color:= clhotlight; //SachsenAnhalt floodfill(paintbox1.Left+370,paintbox1.Top+370,clblack, fsborder); brush.color:= clyellow; //Sachsen floodfill(paintbox1.Left+270,paintbox1.Top+270,clblack, fsborder); brush.color:= clpurple; //Thüringen floodfill(paintbox1.Left+250,paintbox1.Top+320,clblack, fsborder); brush.color:= clolive; //Berlin floodfill(paintbox1.Left+385,paintbox1.Top+200,clblack, fsborder); brush.color:= cllime; //Hamburg floodfill(paintbox1.Left+220,paintbox1.Top+115,clblack, fsborder); end; end; procedure Tform1.Button2Click(Sender: TObject); begin Bitmap1.Canvas.CopyRect(Rect(0, 0, Bitmap1.Width, Bitmap1.Height), PaintBox1.Canvas, Rect(0, 0, Bitmap1.Width, Bitmap1.Height)); Bitmap1.SaveToFile('B.bmp');//wird jetzt überschrieben! bitmap1.free; end; procedure Tform1.Button1Click(Sender: TObject); begin form1.close; end; end. |
Re: Grafik als screenshot
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
du hast jetzt praktisch gar nichts geändert denn
Delphi-Quellcode:
war sowieso umsonst. Dann lieber so:
with paintbox1 do
Delphi-Quellcode:
Dein onPaint Ereignis hast du immer noch nicht abgeändert. Jedesmal wenn du floodfill() benutzt, wird 'DeutschUmriss.bmp' nach meiner Meinung immer wieder neu geladen. Daher kann ich nur auf meinen letzten Beitrag verweisen.
procedure tform1.einfaerben(sender:TObject);
Var farbe:tcolor; x,y:integer; begin with paintbox1.canvas do begin dein Code:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('DeutschUmriss.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); Bitmap1.Free; einfaerben(sender); end; Ich habe dir eine Demo angehängt, wo der gleiche Code von dir benutzt wird, jedoch anstatt der TPaintbox mit einem TImage. Beim TImage kannst du gleich auf den Canvas deines Bitmaps zeichnen. |
Re: Grafik als screenshot
an bitsetter
das mit den 2 bitmaps: die eine zum Färben, die andere mit degfinierten Farben zu abfragen ist eine gute Idee. Doch wie kriege ich die beiden bitmaps so, dass ich abfragen kann. Mit: procedure tform54.paintbox2paint(sender:TObject); begin Bitmap2 := TBitmap.Create; Bitmap2.LoadFromFile('laender.bmp'); paintbox2.Canvas.Draw(0,0,Bitmap2); Bitmap2.Free; faerben(sender); end; frage ich die Eingefärbte ab (durch faerben kommen die definierten Farben auf die Länder). Mit Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('DeutschUmriss.bmp'); PaintBox1.Canvas.Draw(0,0,Bitmap1); Bitmap1.Free; frage ich die n ach den Fraktionen einzufärbenmden ab. Mit paintbox2paint(sender); label20.Show; paintbox1paint(sender); weiter(sender); lade ich beiden - ich denke hier ist der Fehler und nuin klappt die Zuordnung zu vordefinierten Farben zu Bundesländernamen nicht mehr wo istz der fehler danke und ciau |
Re: Grafik als screenshot
Hallo,
gedacht ist es eigentlich so, dass du die Bundesländer einmalig verschiedenfarbig mit der procedure einfaerben einfärbst und dann das Bild abspeicherst. Dann kannst du das eingefärbte Bild mit Bitmap1.LoadFromFile laden und im onMouseMove Ivent der Paintbox kannst du dann die Farben des Bildes mit Bitmap1.canvas.pixels[X, Y] auslesen.
Delphi-Quellcode:
//onMouseMove Ivent der Paintbox procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin//Zuornung der Farben entsprechen der procedure einfaerben label1.caption:= ''; case PaintBox1.canvas.pixels[X, Y] of//Farbe unter dem Cursor auslesen //case PaintBox2.canvas.pixels[X, Y] of //case Bitmap1.canvas.pixels[X, Y] of//oder Farbe vom Bitmap auslesen clbackground: label1.caption := 'NRW'; clskyblue: label1.caption := 'RHPf'; clblack: label1.caption := 'Nieders'; clred: label1.caption := 'Hessen '; clfuchsia: label1.caption := 'BaWü '; clmaroon: label1.caption := 'Bayern '; clgreen: label1.caption := 'Saarland '; claqua: label1.caption := 'Schl.Holstein'; clmoneygreen: label1.caption := 'Bremen '; clmedgray: label1.caption := 'Mecklenburg Vorpomm '; clappworkspace: label1.caption := 'Brandenburg'; clhotlight: label1.caption := 'SachsenAnhalt'; clyellow: label1.caption := 'Sachsen '; clpurple: label1.caption := 'Thüringen '; clolive: label1.caption := 'Berlin '; cllime: label1.caption := 'Hamburg '; end; end; |
Re: Grafik als screenshot
Einfärben und Namen abfrtagen klappt;
Es klappt nicht, die Originalfarbige in den Arbeitsspeicher zu schaffen (wie???) und die mit dne Parteifarben einzufärbenden im Vordergrund zu haben. die mit verschiedenen Farben (nur in den Arbeitsspeicher) zu ladende Datei heisst: Bitmap2 := TBitmap.Create; Bitmap2.LoadFromFile('bildbundeslaender.bmp'); paintbox1.Canvas.Draw(0,0,Bitmap2); sie erhält dann unterschiedliche Farben. Die Parteien bmp (alle gleiche Position und gleoiche Größe) wird aufgerufen mit: Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile('laender.bmp'); paintbox2.Canvas.Draw(0,0,Bitmap1); faerben(sender); dann klappt das mit dem Mauszeiger drüberfahren nicht mehr procedure TForm1.paintbox2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // label1.caption:= ''; if (X <= paintbox2.Width) and (Y <= paintbox2.Height) then case paintbox2.canvas.pixels[X, Y] of clcream:label1.Caption:='Nordrhein-Westfalen'; $0005727A:label1.Caption:='Rheinland-Pfalz'; $006F6F11:label1.Caption:='Niedersachsen'; $00C551D9:label1.Caption:='Hessen'; ... end; end; Ohne die bitmap1 funktioniert die Darstellung und die Ländernamen. Außerdem: ih würde gerne den label1.caption dann jeweils an der Mausspitze haben, um den Ländernamen quasi "auf" dem Land zu haben, wenn ich drüberfahre Wie das geht, weiss ich nicht :wall: wer hilft?? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz