Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Grafik als screenshot (https://www.delphipraxis.net/86872-grafik-als-screenshot.html)

Namenloser 4. Mär 2007 13:39

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...

Hartfrid Krause 4. Mär 2007 18:33

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ß

bitsetter 4. Mär 2007 21:24

Re: Grafik als screenshot
 
Zitat:

Zitat von NamenLozer
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.

@Hartfrid Krause: NamenLozer meint du könntest dir noch ein 2. Bild erstellen, diesmal aber mit verschiedenfarbigen Bundesländern und dann lädst du das Bild in den Speicher:

Delphi-Quellcode:
  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;
Bis auf die Farben, sollten beide Bilder, also stärkste Fraktionen und farbige Bundesländer aber identisch sein.

Hartfrid Krause 8. Mär 2007 13:55

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:
 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.
[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]

bitsetter 8. Mär 2007 19:13

Re: Grafik als screenshot
 
Hallo,

hier ist ein Ausschnitt aus deinem Code:
Delphi-Quellcode:
procedure tform1. paintbox1paint(sender:TObject);
begin
Bitmap1 := TBitmap.Create;
Bitmap1.LoadFromFile('laender.bmp');
PaintBox1.Canvas.Draw(0,0,Bitmap1);
// Bitmap1.Free;
einfaerben(sender);
end;
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:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Bitmap1 := TBitmap.Create;
Bitmap1.LoadFromFile('laender.bmp');
PaintBox1.Canvas.Draw(0,0,Bitmap1);
einfaerben(sender);
end;
Also einen Button hinzufügen und damit das Bild laden und nicht mit onPaint.

Folgendes ist mir auch noch aufgefallen, wieder Code von dir:
Delphi-Quellcode:
   
procedure tform1.einfaerben(sender:TObject);
Var farbe:tcolor;
x,y:integer;
begin
   with canvas do
   with paintbox1 do
   begin
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.

Ob damit das Problem gelöst ist, weis ich allerdings nicht.

Hartfrid Krause 10. Mär 2007 14:36

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:
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.
[edit=Jelly]Nächstes mal die Code-Tags bitte selbs einfügen Mfg, Jelly[/edit]

bitsetter 10. Mär 2007 16:58

Re: Grafik als screenshot
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

du hast jetzt praktisch gar nichts geändert denn
Delphi-Quellcode:
 with paintbox1 do
war sowieso umsonst. Dann lieber so:
Delphi-Quellcode:
procedure tform1.einfaerben(sender:TObject);
Var farbe:tcolor;
x,y:integer;
begin
   with paintbox1.canvas do
   begin
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.
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.

Hartfrid Krause 12. Mär 2007 20:18

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

bitsetter 12. Mär 2007 22:25

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;

Hartfrid Krause 13. Mär 2007 15:27

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.
Seite 2 von 3     12 3      

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