| Posledná zmena: 30.10.2002

bitmapy

## Bitmapy

centrovanie
vycentrovanie obrázka obrazok.bmp do Image1 |
    var
      bmp:TBitmap;
      x,y:integer;
    begin
      bmp:=TBitmap.Create;
      bmp.LoadFromFile('obrazok.bmp');
      x:=(Image1.Width-bmp.Width)div 2;
      y:=(Image1.Height-bmp.Height)div 2;
      Image1.Canvas.Draw(x,y,bmp);
      bmp.Free;
    end;
opečiatkuj obrázok, ak sú známe súradnice jeho stredu
procedure Draw2(x,y,bmp) - na pozíciu x,y grafickej plochy Image1 položiť obrázok (bmp) tak, aby na tejto pozícii bol stred obrázka |
    procedure Draw2(x,y:integer; bmp:TBitmap);
    begin
      Image1.Canvas.Draw(x-bmp.Width div 2,
                         y-bmp.Height div 2,
                         bmp);
    end;
natiahnutie so zachovaním pomeru strán
procedure natiahni(i:TImage; bmp:TBitmap) - StretchDraw aby sa zachoval pomer strán obrázka bmp možeme použiť max s knižnice Math, t.j. muselo by byť uses Math; zistite, ako sa zmení natiahnutie, keď namiesto max použijeme min |
    procedure natiahni(i:TImage; bmp:TBitmap);
    var
      p,px,py:real;
      r:TRect;
    begin
      px:=i.Width/bmp.Width;
      py:=i.Height/bmp.Height;
      p:=max(px,py);
      r:=Rect(0,0,round(p*bmp.Width),round(p*bmp.Height));
      i.Canvas.StretchDraw(r,bmp);
    end;
obrázok v mriežke (v gride)
na ButtonClick: opečiatkuje obrazok.bmp na náhodnú pozíciu v gride, pričom grid je podľa veľkosti obrázka |
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp:TBitmap;
      x,y,w,h:integer;
    begin
      bmp:=TBitmap.Create;
      bmp.LoadFromFile('obrazok.bmp');
      w:=Image1.Width div bmp.Width;
      h:=Image1.Height div bmp.Height;
      x:=random(w)*bmp.Width;
      y:=random(h)*bmp.Height;
      Image1.Canvas.Draw(x,y,bmp);
      bmp.Free;
    end;
šachovnica
dve bitmapy bmp1.bmp a bmp2.bmp sú rovnako veľké - vykachličkovať šachovnicovo |
    var
      bmp1,bmp2:TBitmap;
      x,y:integer;
      b1,b2:boolean;
    begin
      bmp1:=TBitmap.Create;
      bmp1.LoadFromFile('bmp1.bmp');
      bmp2:=TBitmap.Create;
      bmp2.LoadFromFile('bmp2.bmp');
      y:=0; b1:=true;
      while y<Image1.Height do begin
        x:=0; b2:=b1;
        while x<Image1.Width do begin
          if b2 then Image1.Canvas.Draw(x,y,bmp1)
          else Image1.Canvas.Draw(x,y,bmp2);
          inc(x,bmp1.Width); b2:=not b2;
        end;
        inc(y,bmp1.Height); b1:=not b1;
      end;
      bmp1.Free; bmp2.Free;
    end;
najväčšia bitmapa
máme 8 bitmáp b1.bmp, b2.bmp ... b8.bmp - najväčšiu z týchto bitmáp treba vykresliť do Image1 - najväčšia nech je napr. s najväčším súčinom širky a výšky |
    var
      bmp:TBitmap;
      i,imax,suc,max:integer;
    begin
      bmp:=TBitmap.Create;
      max:=0;
      for i:=1 to 8 do begin
        bmp.LoadFromFile('b'+IntToStr(i)+'.bmp');
        suc:=bmp.Width*bmp.Height;
        if suc>max then begin
          max:=suc; imax:=i;
        end;
      end;
      bmp.LoadFromFile('b'+IntToStr(imax)+'.bmp');
      with Image4.Canvas do begin
        Draw(0,0,bmp);
        Font.Color:=clRed;
        TextOut(0,0,
            IntToStr(bmp.Width)+'x'+IntToStr(bmp.Height));
      end;
      bmp.Free;
    end;

### Ďalšie úlohy

- dané sú bitmapy b1.bmp, b2.bmp, ... bN.bmp - zistiť najväčšiu šírku a najväčšiu výšku a potom v takomto gride vykresliť všetky bitmapy do Image1, napr. Image1 je 350x350, maximálna šírka bola 100 a výška 70, t.j. grid je 100x70 (po tri bitmapy v jednom riadku) - do prvého riadka sa vykreslia b1.bmp..b3.bmp; do druhého (od y-súradnice 70) b4.bmp..b6.bmp, ...

### Prémiová domáca úloha

- napíšte program, ktorý vypíše ľubovoľný pascalovský program s vysvietením lexém:

- všetky rezervované slová budú tučným písmom (bold)
- všetky komentáre budú tmavomodré a kurzívou (italic) - komentáre {...}, //..., (*...*)
- všetky číselné konštanty (aj reálne) budú zafarbené nejakou farbou (napr. svetlomodré)
- všetky znakové reťazce (aj s apostrofmi aj s # kódmi) budú zafarbené nejakou inou farbou (napr. červené), napr. aj 'abcd'#13#10'efgh'

- zrejme použijete skener z prednášky, do ktorého doplníte chýbajúce časti
- výpis bude v neproporčnom fonte, napr. "Courier New"
- výstup môže byť

- do Canvasu nejakej grafickej plochy (toto bude najmenej hodnotené riešenie)
- do komponentu RichEdit - podobný Memo, ale umožňuje nastavovať štýl fontu a farby
- do súboru vo formáte .HTML

© 2002 AB, KVI
blaho@fmph.uniba.sk