Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#17

AW: Auf die Komponente Image malen?

  Alt 5. Okt 2012, 17:24
@loirad

Bist du das der mal gefragt hat wie man einen Bilderrahmen zeichnen kann?

Was du hier versuchst ist eigentlich nicht so schwer, aber doch schon etwas komplexer. Du versuchst aber zu sehr den einfachen Weg zu gehen und der klappt nicht. Manchmal sollte man stoppen und ein Schritt zurück gehen.

Also vorausgesetzt ich habe dein Problem richtig verstanden, dann beschreibe ich dir deinen Fehler. Du hast eine 2000x2000 Pixel große Bitmap die du in eine Image lädst. Die Image skalierst du auf 500x500 Pixel. Nun willst du auf dem Bild einen Bilderrahmen zeichnen. Das klappt aber nicht so richtig, denn die Pixel auf der Image entsprechen nicht der von dir eingestellten Größe. Der Grund ist der: auch wenn die Image das Bild skaliert, ist das Bild im Speicher immer noch das Originalbild, z. B 2000x2000 Pixel. Wenn du da jetzt einen Rahmen von 4 Pixeln zeichnest, dann ist der auf der Image 1 Pixel groß. Der Grund: du hast auf der Originalgrafik gezeichnet und die wurd von der Image skaliert. Dabei ist es egal ob du direkt auf Image.Canvas zeichnest. Wie gesagt, du zeichnest da trotzdem auf der Bitmap.

Lösung: du lädst dein Bild in eine TBitmap und skalierst es manuell sie auf 500x500. Dann übergibst du sie an die TImage und schaltest vorher Scale ab. Jetzt kannst du auf der TImage zeichnen und zwei Pixel sind dann auch zwei Pixel dick.


//Eidit:

Hier ein kleines Beispiel

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, x, y: Integer;
begin
  Image1.Width := 105; //Größe der Image
  Image1.Height := 105;

  Image1.Picture.Bitmap.Width := 210; //Größe der Bittmap, doppelt
  Image1.Picture.Bitmap.Height := 210;

  Image1.Stretch := True;

  for x := 0 to 105 {Width} do
    for y := 0 to 105 {Height} do
      Image1.Picture.Bitmap.Canvas.Pixels[x, y] := clBlack;

  {Obwohl Image1 105 Pixel groß ist, wird nur ein viertel gezeichnet}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Image1.Stretch := not Image1.Stretch;
end;
In dem Beispiel soll das ganze Bild geschwärzt werden, wird aber nur ein viertel, auch wenn die Image Größe und die Schleife gleiche Werte haben.

Geändert von Popov ( 5. Okt 2012 um 17:30 Uhr)
  Mit Zitat antworten Zitat