// Das hab ich nun davon. Nachdem ich Bilder zu einer Röhre formen und
// Bilder zu einem Vierkant formen veröffentlicht habe, kommen EMail-Anfragen,
// ob das nicht auch mit einer dreikantigen Röhre funktioniert.
// Na wenns denn unbedingt sein muss:
 

Original
Beispiel 1 Beispiel 2



// Getestet mit D4 unter XP

type 
  pc = ^TColor; 
 
var 
  bm, triangle: TBitmap; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  triangle := TBitmap.create; 
  bm := TBitmap.create; 
  bm.loadfromfile('c:\Frosch.bmp'); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  bm.free; 
  triangle.free; 
end; 
 
function mach3(src, dst: TBitmap; grund: TColor; 
  rand, zu: pc; variante: boolean; lus: byte; zeichnen: boolean = true): TPoint; 
var 
  xs, xd, schmal, breit, mass, 
    w3, m3, b3: integer; 
  ps, pd: PBytearray; 
  r, g, b, rz, gz, bz: byte; 
  function SetByte(i: integer): byte; 
  asm 
  CMP  EAX, 255 
  JG   @MAX 
  CMP  EAX, 0 
  JGE  @OK 
  MOV  EAX, 0 
  JMP  @OK 
@MAX: 
  MOV  EAX,255 
@OK: 
  end; 
  procedure strich; 
  begin 
    pd[xd] := b; 
    pd[xd + 1] := g; 
    pd[xd + 2] := r; 
  end; 
  procedure oben; 
  begin 
    pd[xd] := bz; 
    pd[xd + 1] := gz; 
    pd[xd + 2] := rz; 
  end; 
  procedure gerade(h, t, d: integer; z, r: boolean); 
  var 
    y: integer; 
  begin 
    for y := 0 to h do begin 
      xs := m3; 
      xd := 0; 
      ps := src.scanline[y]; 
      pd := dst.scanline[y + t]; 
      while xd < b3 do begin 
        if z then oben else begin 
          if (y = 0) and r then strich else begin 
            pd[xd] := setbyte(ps[xs] - d); 
            pd[xd + 1] := setbyte(ps[xs + 1] - d); 
            pd[xd + 2] := setbyte(ps[xs + 2] - d); 
          end; 
        end; 
        inc(xs, 3); 
        inc(xd, 3); 
      end; 
    end; 
  end; 
  procedure links(h, d: integer; t: PInteger; z, r: boolean); 
  var 
    y: integer; 
  begin 
    for y := 0 to h do begin 
      xs := m3; 
      xd := 0; 
      ps := src.scanline[y]; 
      while xd < m3 do begin 
        pd := dst.scanline[y + t^ div 6]; 
        if z then oben else begin 
          if (y = 0) and r then strich else begin 
            pd[xd] := setbyte(ps[xs] - d); 
            pd[xd + 1] := setbyte(ps[xs + 1] - d); 
            pd[xd + 2] := setbyte(ps[xs + 2] - d); 
          end; 
        end; 
        dec(xs, 3); 
        inc(xd, 3); 
      end; 
    end; 
  end; 
  procedure rechts(h, t, d, w: integer; z, r: boolean); 
  var 
    y: integer; 
  begin 
    for y := 0 to h do begin 
      xs := w3; 
      xd := m3; 
      ps := src.scanline[y]; 
      while xd < b3 do begin 
        if w < 0 then 
          pd := dst.scanline[y + xd div 6 - schmal] else 
          pd := dst.scanline[y - xd div 6 + mass]; 
        if z then oben else begin 
          if ((xd = m3) or (y = 0) and r) and (rand <> nil) then strich 
          else begin 
            pd[xd] := setbyte(ps[xs] - d); 
            pd[xd + 1] := setbyte(ps[xs + 1] - d); 
            pd[xd + 2] := setbyte(ps[xs + 2] - d); 
          end; 
        end; 
        dec(xs, 3); 
        inc(xd, 3); 
      end; 
    end; 
  end; 
begin 
  result := point(0, 0); 
  try 
    if (src = nil) or (src.width < 24) 
      or (src.width / src.height > 3) 
      then exit; 
    schmal := src.width div 8; 
    breit := src.width div 2; 
    mass := src.width div 4; 
    if zeichnen then begin 
      dst.width := breit; 
      dst.height := src.height + schmal; 
      if rand <> nil then begin 
        rand^ := ColorToRGB(rand^); 
        r := getrvalue(rand^); 
        g := getgvalue(rand^); 
        b := getbvalue(rand^); 
      end; 
      if zu <> nil then begin 
        zu^ := ColorToRGB(zu^); 
        rz := getrvalue(zu^); 
        gz := getgvalue(zu^); 
        bz := getbvalue(zu^); 
      end; 
      src.pixelformat := pf24bit; 
      dst.pixelformat := pf24bit; 
      w3 := src.width * 3 - 3; 
      m3 := mass * 3; 
      b3 := breit * 3; 
      with dst.canvas do begin 
        brush.color := grund; 
        fillrect(cliprect); 
      end; 
      if not variante then begin 
        gerade(schmal, 0, lus, zu <> nil, false); 
        links(src.height - 1, -(lus div 2), @xd, false, rand <> nil); 
        rechts(src.height - 2, schmal, 0, 1, false, true); 
      end else begin 
        links(schmal, lus, @xs, zu <> nil, false); 
        rechts(schmal, 0, lus, -1, zu <> nil, false); 
        gerade(src.height - 1, schmal, 0, false, rand <> nil); 
      end; 
    end; 
    result := point(breit, src.height + schmal); 
  except 
  end; 
end; 
 
function calculateTriangle(src: TBitmap): TPoint; 
begin 
  result := mach3(bm, nil, 0, nil, nil, false, 0, false); 
end; 
 

// ---------- Beispiele ---------- 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  pr, pg: pc; 
  c, g: TColor; 
  p: TPoint; 
begin 
// Beispiel 1 
  pr := @c; 
  c := $33CF33; 
  if mach3(bm, triangle, color, pr, nil, false, 75).x > 0 then 
    canvas.draw(20, 30, triangle) else 
    showmessage('Fehler 1'); 
// Beispiel 2 
  pg := @g; 
  g := clgreen; 
  if mach3(bm, triangle, color, nil, pg, true, 0).x > 0 then 
    canvas.draw(280, 30, triangle) else 
    showmessage('Fehler 2'); 
// Beispiel 3 (nur Abmaße abfragen) 
  p := CalculateTriangle(bm); 
  if p.x = 0 then showmessage('Fehler') else 
    showmessage('Zielbitmap hat ' + inttostr(p.x) + ' x ' + 
      inttostr(p.y) + ' Pixel'); 
end;




 

Zugriffe seit 6.9.2001 auf Delphi-Ecke