Hat er doch schon oben, das Beispielbild.
@milos: Hast du dir schonmal - wie oben erwähnt -
StretchBlt angeschaut?
Wenn du ein Bild nach einem bestimmten Filter strecken willst (also in dem Fall "Pixel-Wiederholung"), brauchst du einen Algorithmus, der das erledigt. Ich weiß nicht, ob die VampyreImagingLibrary sowas dabei hat oder die Graphics32.
Andernfalls hast du hier schon alle Werkzeuge genannt bekommen, die du dafür brauchst, um das schnell und effizient zu machen. Stichwort: ScanLine.
Wenn du willst, dass in einem Zielbild ein Pixel aus dem Quellbild in einem 5x5- oder 10x10-Block gezeichnet wird, musst du mit entsprechenden Schleifen jeden Pixel im Quellbild auslesen und im Zielbild diesen Pixel im gewünschten Block "nachbilden".
ScanLineP := Bitmap.ScanLine[Y]
liefert dir einen Zeiger zu einer
RGB(A)-"Y-Zeile". Und mit
Inc(ScanLineP);
kannst du dich in der X-Spalte vorwärtsbewegen.
Wenn du also etwas von Bild1 auf Bild2 per ScanLine zeichnen willst, brauchst du ... ? Richtig, zwei ScanLine-Zeiger.
Delphi-Quellcode:
uses
Winapi.Windows;
type
PRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray =
Array[0..0]
of TRGBQuad
var
ScanLine_Source,
ScanLine_Target: PRGBQuadArray;
X, Y: Integer;
begin
// Annahme: Bitmap1.Width = Bitmap2.Width und Bitmap1.Height = Bitmap2.Height!
for Y := 0
to Bitmap1.Height - 1
do
begin
ScanLine_Source := Bitmap1.ScanLine[Y];
ScanLine_Target := Bitmap2.ScanLine[Y];
for X := 0
to Bitmap1.Width - 1
do
begin
ScanLine_Target[X]^ := ScanLine_Source[X]^;
{ Das gleiche wie
ScanLine_Target[X]^.rgbBlue := ScanLine_Source[X]^.rgbBlue;
ScanLine_Target[X]^.rgbGreen := ScanLine_Source[X]^.rgbGreen;
ScanLine_Target[X]^.rgbRed:= ScanLine_Source[X]^.rgbRed;
ScanLine_Target[X]^.rgbReserved:= ScanLine_Source[X]^.rgbReserved;
}
end;
end;
end;
Wenn du also willst, dass ein Pixel von Bitmap1 in Bitmap2 X-und-Y-mal wiederholt wird, musst du - unter Berücksichtung der Bilddimensionen - die X-Schleife entsprechend anpassen und erweitern.