Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 02.01.12 20:06 
Hallo!

Ich komme gerade mit CopyRect nicht zurecht: Ich habe ein Bitmap, 640 x 500 Pixel, und möchte daraus 25 je 128 x 100 Pixel grosse Bereiche in ein anderes Bitmap kopieren.

Also: Kopiere von Image1 den Bereich 0,0,128,100 in Image2 und speichere Image2 als Datei,
dann kopiere von Image1 den Bereich 128,0,256,100 in Image2 und speichere Image2 als Datei,
dann kopiere von Image1 den Bereich 256,0,384,100 in Image2 und speichere Image2 als Datei,
bei waagrecht 5 erhöhe den Zähler für Top um 100, setzt Left wieder auf 0 und beginne erneut,
... mache das waagrecht und senkrecht je 5x.

Ich möchte also ein Bitmap in kleinere Teile aufteilen und jeden dieser Teile als .bmp speichern. Zusammengesetzt sollen sie wieder das Bitmap ergeben.

Alles, was ich erhalte, sind verzerrte oder falsche Bilder...

Mein Code:
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:
var
  i, l, t: Integer;
  DestRect, SourceRect: TRect;
begin
//128 x 100 Pixel
  l := -128;
  t := -100;
  DestRect.Left := 0;
  DestRect.Top := 0;
  DestRect.Right := 128;
  DestRect.Height := 100;
  SourceRect := DestRect;

  for i := 1 to 25 do
  begin
    Inc(l, 128);

    SourceRect.Left := l;
    SourceRect.Top := t;
    SourceRect.Right := l+128;
    SourceRect.Height := t+100;

    Image2.Picture.Bitmap.Canvas.CopyRect(DestRect,
      Image1.Picture.Bitmap.Canvas, SourceRect);

    Image2.Picture.Bitmap.SaveToFile('D:\Delphi XE2\Projects\'+IntToStr(i)+'.bmp');

    if i mod 5 = 0 then
    begin
      l := -128;
      t := t+100;
    end;
  end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 02.01.12 21:51 
// EDIT:
Gefunden:
Überlege einmal was du in SourceRect.Height reinpackst...
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 02.01.12 21:57 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
// EDIT:
Gefunden:
Überlege einmal was du in SourceRect.Height reinpackst...

Es muss Bottom und nicht Height sein, dann wird auch nichts verzerrt.
Der Code ist, sagen wir mal, noch verbersserungswürdig, aber jetzt läuft es erstmal!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 02.01.12 23:29 
Du meinst so in der Art? :D
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  x, y: Integer;
  DestRect, SourceRect: TRect;
begin
  DestRect := Rect(00128100);
  SourceRect := DestRect;
  for y := 0 to 4 do
    for x := 0 to 4 do
    begin
      SourceRect.SetLocation(x * 128, y * 100);
      Image2.Picture.Bitmap.Canvas.CopyRect(DestRect, Image1.Picture.Bitmap.Canvas, SourceRect);
      Image2.Picture.Bitmap.SaveToFile('D:\Delphi XE2\Projects\' + IntToStr(y * 5 + x) + '.bmp');
    end;