Bitmap.Canvas - Bereich kopieren
spacer
Autor Nachricht
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1564
Erhaltene Danke: 24



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 markieren
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 glumt der jabberwock - und die graisligen gulpen nurmen!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15833
Erhaltene Danke: 737

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 02.01.12 21:51 
// EDIT:
Gefunden:
Überlege einmal was du in SourceRect.Height reinpackst...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1564
Erhaltene Danke: 24



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 glumt der jabberwock - und die graisligen gulpen nurmen!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15833
Erhaltene Danke: 737

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 02.01.12 23:29 
Du meinst so in der Art? :D
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
x, y: Integer;
DestRect, SourceRect: TRect;
begin
DestRect := Rect(0, 0, 128, 100);
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;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home