// Ein Bild wird
auf die verschiedensten Arten pixelweise auf
type Punktsatz = (vonLinks, RechtsobenLinksunten, vondenSeiten, Raute, vonOben, Aufzug, vonLinksoben, Klappe, Zufall, hHalb, ausdenEcken, vHalb, Kreis, Jalousie); var lauf: boolean = false; links: Integer = 16; // z.B. oben: Integer = 70; // z.B. procedure punktweise(dest: TCanvas; x, y: Integer; src: TGraphic; pause: Integer; wie: Punktsatz); var w, h, i, j, k, z, ww, hh, sh2, sw2, m1, m2, m3, xx, ep, Radius: Integer; a: array of array of boolean; hlp: TBitmap; procedure kreispix(x1, y1, x2, y2: Integer); begin if (y1 + y2 < hlp.height) then begin if (x1 + x2 < hlp.width) then setpixel(dest.handle, x + x1 + x2, y + y1 + y2, getpixel(hlp.canvas.handle, x1 + x2, y1 + y2)); if (x1 - x2 >= 0) then setpixel(dest.handle, x + x1 - x2, y + y1 + y2, getpixel(hlp.canvas.handle, x1 - x2, y1 + y2)); end; if (y1 - y2 >= 0) then begin if (x1 + x2 < hlp.width) then setpixel(dest.handle, x + x1 + x2, y + y1 - y2, getpixel(hlp.canvas.handle, x1 + x2, y1 - y2)); if (x1 - x2 >= 0) then setpixel(dest.handle, x + x1 - x2, y + y1 - y2, getpixel(hlp.canvas.handle, x1 - x2, y1 - y2)); end; if (y1 + x2 < hlp.height) then begin if (x1 + y2 < hlp.width) then setpixel(dest.handle, x + x1 + y2, y + y1 + x2, getpixel(hlp.canvas.handle, x1 + y2, y1 + x2)); if (x1 - y2 >= 0) then setpixel(dest.handle, x + x1 - y2, y + y1 + x2, getpixel(hlp.canvas.handle, x1 - y2, y1 + x2)); end; if (y1 - x2 >= 0) then begin if (x1 + y2 < hlp.width) then setpixel(dest.handle, x + x1 + y2, y + y1 - x2, getpixel(hlp.canvas.handle, x1 + y2, y1 - x2)); if (x1 - y2 >= 0) then setpixel(dest.handle, x + x1 - y2, y + y1 - x2, getpixel(hlp.canvas.handle, x1 - y2, y1 - x2)); end; end; begin if lauf or (src.width < 4) or (src.height < 4) then exit; lauf := true; hlp := TBitmap.create; hlp.width := src.width; hlp.height := src.height; hlp.canvas.draw(0, 0, src); setlength(a, hlp.width, hlp.height); zeromemory(@a[0, 0], sizeof(a)); sh2 := round(hlp.height / 2); sw2 := round(hlp.width / 2); case wie of RechtsobenLinksunten: begin ww := sh2 + sw2; hh := 0; end; Aufzug, Klappe, vHalb: begin hh := sh2 - ord(odd(hlp.height)); ww := hlp.width - 1; end; vonLinks: begin hh := hlp.width - 1; ww := hlp.height - 1; end; vonLinksoben: begin ww := hlp.width + hlp.height; hh := 0; end; vondenSeiten, hHalb: begin ww := hlp.height - 1; hh := sw2 - ord(odd(hlp.width)) + 1; end; Jalousie: begin ww := hlp.height - 1; hh := round(hlp.width / 4); end; Kreis: begin ww := round(sqrt(sqr(sh2) + sqr(sw2))) + 1; hh := 0; end; Raute, ausdenEcken: begin if hlp.width > hlp.height then ww := hlp.width else ww := hlp.height; hh := 0; end; else begin ww := hlp.width - 1; hh := hlp.height - 1; end; end; for h := 0 to hh do for w := 0 to ww do begin case wie of Kreis: begin Radius := w; xx := 0; ep := 3 - Radius shl 1; while (xx <= Radius) do begin kreispix(sw2, sh2, xx, Radius); kreispix(sw2, sh2 + 1, xx, Radius); if (ep < 0) then ep := 6 + ep + xx shl 2 else begin ep := 10 + ep + (xx - Radius) shl 2; dec(Radius); end; inc(xx); end; end; RechtsobenLinksunten: begin for k := 0 to w do begin m1 := w - k; m2 := hlp.width - k - 1; m3 := hlp.height - k - 1; if (k < hlp.width) and (m1 < hlp.height) then setpixel(dest.handle, m2 + x, m1 + y, getpixel(hlp.canvas.handle, m2, m1)); if (m3 >= 0) and (m1 < hlp.width) then setpixel(dest.handle, m1 + x, m3 + y, getpixel(hlp.canvas.handle, m1, m3)); end; end; Raute: begin for k := 0 to w do begin m1 := sh2 - k; m2 := sw2 - k + w; m3 := sw2 + k - w; if m1 >= 0 then begin if (m2 < hlp.width) then setpixel(dest.handle, x + m2, y + m1, getpixel(hlp.canvas.handle, m2, m1)); if (m3 >= 0) then setpixel(dest.handle, x + m3, y + m1, getpixel(hlp.canvas.handle, m3, m1)); end; m1 := sh2 + k; if m1 < hlp.height then begin if m3 >= 0 then setpixel(dest.handle, x + m3, y + m1, getpixel(hlp.canvas.handle, m3, m1)); if m2 < hlp.width then setpixel(dest.handle, x + m2, y + m1, getpixel(hlp.canvas.handle, m2, m1)); end; end; end; ausdenEcken: begin for k := 0 to w do begin m1 := w - k; m2 := hlp.width - w + k - 1; m3 := hlp.height - k - 1; if (k <= sh2) then begin if (m1 <= sw2) then begin setpixel(dest.handle, x + m1, y + k, getpixel(hlp.canvas.handle, m1, k)); setpixel(dest.handle, x + m1, y + m3, getpixel(hlp.canvas.handle, m1, m3)); end; if m2 >= 0 then begin setpixel(dest.handle, x + m2, y + k, getpixel(hlp.canvas.handle, m2, k)); setpixel(dest.handle, x + m2, y + m3, getpixel(hlp.canvas.handle, m2, m3)); end; end; end; end; Jalousie: begin setpixel(dest.handle, h + x, w + y, getpixel(hlp.canvas.handle, h, w)); setpixel(dest.handle, hh + h + x - 1, w + y, getpixel(hlp.canvas.handle, hh + h - 1, w)); setpixel(dest.handle, sw2 + h + x - 1, w + y, getpixel(hlp.canvas.handle, sw2 + h - 1, w)); setpixel(dest.handle, hlp.width - hh + h + x - 1, w + y, getpixel(hlp.canvas.handle, hlp.width - hh + h - 1, w)); end; hHalb: begin setpixel(dest.handle, h + x, w + y, getpixel(hlp.canvas.handle, h, w)); setpixel(dest.handle, sw2 + h + x - 1, w + y, getpixel(hlp.canvas.handle, sw2 + h - 1, w)); end; vHalb: begin setpixel(dest.handle, w + x, h + y, getpixel(hlp.canvas.handle, w, h)); setpixel(dest.handle, w + x, sh2 + h + y - 1, getpixel(hlp.canvas.handle, w, sh2 + h - 1)); end; Klappe: begin setpixel(dest.handle, w + x, h + y, getpixel(hlp.canvas.handle, w, h)); setpixel(dest.handle, w + x, src.height - 1 - h + y, getpixel(hlp.canvas.handle, w, src.height - 1 - h)); end; Aufzug: begin setpixel(dest.handle, w + x, h + y + sh2 - 1, getpixel(hlp.canvas.handle, w, h + sh2 - 1)); setpixel(dest.handle, w + x, sh2 - h + y, getpixel(hlp.canvas.handle, w, sh2 - h)); end; vondenSeiten: begin setpixel(dest.handle, h + x, w + y, getpixel(hlp.canvas.handle, h, w)); setpixel(dest.handle, hlp.width - h - 1 + x, w + y, getpixel(hlp.canvas.handle, hlp.width - h - 1, w)); end; vonLinksoben: for k := 0 to w do begin if (k < hlp.width) and (w - k < hlp.height) then setpixel(dest.handle, k + x, w - k + y, getpixel(hlp.canvas.handle, k, w - k)); end; vonOben: setpixel(dest.handle, w + x, h + y, getpixel(hlp.canvas.handle, w, h)); vonLinks: setpixel(dest.handle, h + x, w + y, getpixel(hlp.canvas.handle, h, w)); Zufall: begin repeat i := random(hlp.width); j := random(hlp.height); until a[i, j] = false; setpixel(dest.handle, i + x, j + y, getpixel(hlp.canvas.handle, i, j)); a[i, j] := true; end; end; for z := 0 to pause do application.processmessages; if application.terminated or not lauf then break; end; a := nil; hlp.free; lauf := false; end; procedure TForm1.FormCreate(Sender: TObject); begin Image1.visible := false; // z.B.: // Image1.Picture.Bitmap.Loadfromfile('D:\Bilder\dt.bmp'); end; // --- Beispiele --- procedure TForm1.Button10Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, Kreis); end; procedure TForm1.Button11Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, ausdenEcken); end; procedure TForm1.Button12Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, vondenSeiten); end; procedure TForm1.Button13Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, vonOben); end; procedure TForm1.Button14Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, vonLinks); end; procedure TForm1.Button15Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 25, vonLinksoben); end; procedure TForm1.Button1Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, Zufall); end; procedure TForm1.Button2Click(Sender: TObject); begin lauf := false; end; procedure TForm1.Button3Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 25, Raute); end; procedure TForm1.Button4Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 25, RechtsobenLinksunten); end; procedure TForm1.Button5Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 15, Aufzug); end; procedure TForm1.Button6Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 0, Klappe); end; procedure TForm1.Button7Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, vHalb); end; procedure TForm1.Button8Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, Jalousie); end; procedure TForm1.Button9Click(Sender: TObject); begin lauf := false; refresh; punktweise(canvas, links, oben, Image1.Picture.graphic, 10, hHalb); end; |
Zugriffe seit 6.9.2001 auf Delphi-Ecke