![]() // Getestet mit D4 unter WinME
// 1. procedure HorzFlip(bmp: TBitmap); begin stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height, bmp.canvas.handle, bmp.width - 1, 0, -bmp.width, bmp.height, SRCCOPY); end; procedure VertFlip(bmp: TBitmap); begin stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height, bmp.canvas.handle, 0, bmp.height - 1, bmp.width, -bmp.height, SRCCOPY); end; procedure BothFlip(bmp: TBitmap); begin stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height, bmp.canvas.handle, bmp.width - 1, bmp.height - 1, -bmp.width, -bmp.height, SRCCOPY); end; // Beispielaufruf (bei einem Image "refresh" nicht vergessen) procedure TForm1.Button3Click(Sender: TObject); begin bothflip(image1.picture.bitmap); image1.refresh; end;
type work = (grad90, grad180, grad270, horz, vert); b3 = array[0..2] of byte; var a: array of array of b3; procedure rotate_flip(bmp: tbitmap; art: work); var x, y, h, w, w3: word; p: pbytearray; i: byte; procedure rechnen(b, c: word); var j: byte; begin for j := 0 to 2 do p[x + j] := a[b][c][j]; end; begin bmp.pixelformat := pf24bit; setlength(a, bmp.height); h := bmp.height - 1; for x := 0 to h do setlength(a[x], bmp.width); w3 := bmp.width * 3 - 1; for y := 0 to h do begin p := bmp.scanline[y]; x := 0; while x <= w3 do begin for i := 0 to 2 do a[h - y][x div 3][i] := p[x + i]; inc(x, 3); end; end; if (art = grad90) or (art = grad270) then begin x := bmp.height; bmp.height := bmp.width; bmp.width := x; h := bmp.height - 1; w3 := bmp.width * 3 - 1; end; w := bmp.width - 1; for y := 0 to h do begin p := bmp.scanline[y]; x := 0; while x <= w3 do begin case art of vert: rechnen(y, x div 3); grad90: rechnen(x div 3, y); grad180: rechnen(y, w - x div 3); horz: rechnen(h - y, w - x div 3); else rechnen(w - x div 3, h - y); end; inc(x, 3); end; end; a := nil; end; // Beispielaufruf (bei einem Image "refresh" nicht vergessen) procedure TForm1.Button1Click(Sender: TObject); begin rotate_flip(image1.picture.bitmap, grad90); image1.refresh; end; // Falls ein Image ein JPeg enthält, und dieses nach dem Drehen // auch noch erhalten sein soll, muss man Umwandlungen vornehmen: procedure TForm1.Button5Click(Sender: TObject); var b: TBitmap; j: TJpegImage; begin b := TBitmap.create; j := TJpegImage.create; b.assign(image1.picture.graphic); rotate_flip(b, grad90); j.Assign(b); b.free; image1.picture.assign(j); j.free; end;
type TripleArray = array[0..21844] of TRGBTriple; PTriple = ^TripleArray; var bmp: TBitmap; procedure TForm1.FormCreate(Sender: TObject); begin bmp := TBitmap.create; bmp.loadfromfile('d:\bilder\frau.bmp'); end; procedure TForm1.FormDestroy(Sender: TObject); begin bmp.free; end; procedure Rotate90Clockwise(bitmap: TBitmap); var p: PTriple; x, y: integer; ergebnis: TBitmap; begin bitmap.pixelformat := pf24bit; ergebnis := TBitmap.create; ergebnis.width := bitmap.height; ergebnis.height := bitmap.width; ergebnis.pixelformat := pf24bit; for y := 0 to bitmap.height - 1 do begin p := bitmap.scanline[y]; for x := bitmap.width - 1 downto 0 do PTriple(ergebnis.scanline[bitmap.width - x - 1])[y] := p[x]; end; bitmap.width := ergebnis.width; bitmap.height := ergebnis.height; bitmap.canvas.draw(0, 0, ergebnis); ergebnis.free; end; // Bei jedem Klick wird das Bitmap um 90 Grad // gegen den Uhrzeigersinn gedreht procedure TForm1.Button1Click(Sender: TObject); begin Rotate90Clockwise(bmp); refresh; canvas.draw(0, 0, bmp); end;
procedure b90(SrcBitmap: TBitmap; UhrzeigerSinn: boolean); var x, y, xx, yy: integer; DestBitmap: TBitmap; begin DestBitmap := TBitmap.create; DestBitmap.width := SrcBitmap.height; DestBitmap.height := SrcBitmap.width; for x := 0 to SrcBitmap.width do for y := 0 to SrcBitmap.height do begin if UhrzeigerSinn then begin xx := x; yy := pred(DestBitmap.width - y); end else begin yy := y; xx := pred(SrcBitmap.width - x); end; setpixel(DestBitmap.canvas.handle, y, xx, GetPixel(SrcBitmap.canvas.handle, x, yy)); end; SrcBitmap.Assign(DestBitmap); DestBitmap.Free; end; //----------------------------------------------------------------- // 5. (Ergänzung zu 2.) // Natürlich funktioniert das auch mit Bitmaps in 32 Bit, indem man // alle Dreien in eine Vier ändert und 0..2 mit 0..3 ersetzt. type work = (grad90, grad180, grad270, horz, vert); b3 = array [0 .. 3] of byte; var a: array of array of b3; procedure TForm4.rotatex(bmp: tbitmap; art: work); var X, Y, h, w, w3: word; p: pbytearray; i: byte; procedure rechnen(b, c: word); var j: byte; begin for j := 0 to 3 do p[X + j] := a[b][c][j]; end; begin bmp.pixelformat := pf32bit; // <----- setlength(a, bmp.height); h := bmp.height - 1; for X := 0 to h do setlength(a[X], bmp.width); w3 := bmp.width * 4 - 1; for Y := 0 to h do begin p := bmp.scanline[Y]; X := 0; while X <= w3 do begin for i := 0 to 3 do a[h - Y][X div 4][i] := p[X + i]; inc(X, 4); end; end; if (art = grad90) or (art = grad270) then begin X := bmp.height; bmp.height := bmp.width; bmp.width := X; h := bmp.height - 1; w3 := bmp.width * 4 - 1; end; w := bmp.width - 1; for Y := 0 to h do begin p := bmp.scanline[Y]; X := 0; while X <= w3 do begin case art of vert: rechnen(Y, X div 4); grad90: rechnen(X div 4, Y); grad180: rechnen(Y, w - X div 4); horz: rechnen(h - Y, w - X div 4); else rechnen(w - X div 4, h - Y); end; inc(X, 4); end; end; a := nil; end; |
Zugriffe seit 6.9.2001 auf Delphi-Ecke