Przechowywanie bitmap

0

Mam pewien programik w ktorym na canvasie rysuje sobie rozne punkciki, teksty i nne cos ala mapka. Chcialbym teraz miec mozliwosc wczytywania obrazow rastrowych (bitmap) na ta mapke, przy czym chcialbym miec mozliwosc okreslenia ich polozenia. Zalezy mi oczywiscie aby rozwiazanie bylo optymalne pod katem pamieciozernosci, i szybkosci dzialania - dlatego pytam jak najlepiej cos takiego zaimplementowac. Myslalem zeby wczytywac sobie obraz do bitmapy, dolozyc jakies rekordy ze wspolrzednymi narozy, i przed narysowaniem, obliczyc wspolrzedne ekranowe tych narozy no i uzyc moze metody strech draw. Tylko zastanawiam sie czy to jest najszybsze co moze byc ? Musi to byc rysowanie po canvasie (bo juz sporo mam w ten sposob zrobione), dlatego nie chce jakichs directx, albo opengl'ow. Czy ma moze ktos jakies algorytmy do takich rzeczy ? interesowalo by mnie tez skalowanie i obracanie obrazow.

Z gory dziekuje.

0

Skalowanie procentowe

function Skalowanie_procentowe(bitmapa1, bitmapa2: TBitmap; procent: Integer): Boolean;
var
  TmpBmp: TBitmap;
  ARect: TRect;
  h, w: Real;
  hi, wi: Integer;
begin
  Result := False;
  try
    TmpBmp := TBitmap.Create;
    try
      h := bitmapa1.Height * (procent / 100);
      w := bitmapa1.Width * (procent / 100);
      hi := StrToInt(FormatFloat('#', h)) + bitmapa1.Height;
      wi := StrToInt(FormatFloat('#', w)) + bitmapa1.Width;
      TmpBmp.Width := wi;
      TmpBmp.Height := hi;
      ARect := Rect(0, 0, wi, hi);
      TmpBmp.Canvas.StretchDraw(ARect, bitmapa1);
      bitmapa2.Assign(TmpBmp);
    finally
      TmpBmp.Free;
    end;
    Result := True;
  except
    Result := False;
  end;
end;

i sposób użycia

// zmniejszenie obrazka o 70 procent
procedure TForm1.Button1Click(Sender: TObject);
begin
    Skalowanie_procentowe(Image1.Picture.Bitmap, Image2.Picture.Bitmap, -70);
end;

Odbicia

procedure Odbij_w_poziomie(Image:TImage32);
var i,j,kolor:integer;
begin
   for i := 0 to (Image.Bitmap.Height-1) do
       for j:= 0 to (Image.Bitmap.Width div 2)-1  do
       begin
           kolor:=Image.Bitmap.Canvas.Pixels[j,i];
           Image.Bitmap.Canvas.Pixels[j,i]:=Image.Bitmap.Canvas.Pixels[Image.Bitmap.Width-1-j,i];
           Image.Bitmap.Canvas.Pixels[Image.Bitmap.Width-1-j,i]:=kolor;
       end;
end;

procedure Odbij_w_pionie(Image:TImage32);
var i,j,kolor:integer;
begin
   for i := 0 to (Image.Bitmap.Height div 2)-1 do
       for j:= 0 to (Image.Bitmap.Width-1) do
       begin
           kolor:=Image.Bitmap.Canvas.Pixels[j,i];
           Image.Bitmap.Canvas.Pixels[j,i]:=Image.Bitmap.Canvas.Pixels[j,Image.Bitmap.Height-1-i];
           Image.Bitmap.Canvas.Pixels[j,Image.Bitmap.Height-1-i]:=kolor;
       end;
end;

Obroty

procedure Obroc_o_90_w_lewo(Image, Image2:TImage32);
var i,j:integer;
    wysokosc,szerokosc:integer;
begin
    wysokosc:=Image.Bitmap.Height;
    szerokosc:=Image.Bitmap.Width;
    Image.Bitmap.Height:=szerokosc;
    Image.Bitmap.Width:=wysokosc;
    for j:= 0 to (Image2.Bitmap.Width-1) do
       for i := 0 to (Image2.Bitmap.Height-1) do
           Image.Bitmap.Canvas.Pixels[i,Image.Bitmap.Height-1-j]:=Image2.Bitmap.Canvas.Pixels[j,i];
end;


procedure Obroc_o_90_w_prawo(Image, Image2:TImage32);
var i,j:integer;
    wysokosc,szerokosc:integer;
begin
    wysokosc:=Image.Bitmap.Height;
    szerokosc:=Image.Bitmap.Width;
    Image.Bitmap.Height:=szerokosc;
    Image.Bitmap.Width:=wysokosc;
    for j:= 0 to (Image2.Bitmap.Width-1) do
       for i := 0 to (Image2.Bitmap.Height-1) do
           Image.Bitmap.Canvas.Pixels[Image.Bitmap.Width-1-i,j]:=Image2.Bitmap.Canvas.Pixels[j,i];
end;

procedure TForm1.Obroc_o_dowolny_kat(Image, Image2:TImage32; kat:double);
var i,j,kolor:integer;
    srodek_x,srodek_y,X,Y,X1,Y1:integer;
    roznica_x,roznica_y:integer;
    tablica_punktow:array of array of byte;
    r1,r2,r3,r4,r5,r6,r7,r8:integer;
    g1,g2,g3,g4,g5,g6,g7,g8:integer;
    b1,b2,b3,b4,b5,b6,b7,b8:integer;
    r_srednie,g_srednie,b_srednie:integer;
    kolor_sasiada:TColor;
    ilosc:integer;
begin
    srodek_x:=Image2.Bitmap.Width div 2;
    srodek_y:=Image2.Bitmap.Height div 2;
    roznica_y:=(Image.Height-Image2.Bitmap.Height)div 2;
    roznica_x:=(Image.Width-Image2.Bitmap.Width)div 2;
    Image.Bitmap.Height:=Image.Height;
    Image.Bitmap.Width:=Image.Width;

    setlength(tablica_punktow,Image.Bitmap.Height,Image.Bitmap.Width);
    for j:= 0 to (Image.Bitmap.Width-1) do
       for i := 0 to (Image.Bitmap.Height-1) do
           tablica_punktow[j,i]:=0;

    for j:= 0 to (Image.Bitmap.Width-1) do
       for i := 0 to (Image.Bitmap.Height-1) do
           Image.Bitmap.Pixels[j,i]:=clWhite;

    for j:= 0 to (Image2.Bitmap.Width-1) do
       for i := 0 to (Image2.Bitmap.Height-1) do
       begin
           kolor:=Image2.Bitmap.PixelS[j,i];
           X:=j + roznica_x;
           Y:=i + roznica_y;
           X:=X - srodek_x;
           Y:=Y - srodek_y;
           X1:=round(X*cos(kat)-Y*sin(kat));
           Y1:=round(X*sin(kat)+Y*cos(kat));
           X1:=X1 + srodek_x;
           Y1:=Y1 + srodek_y;
           Image.Bitmap.PixelS[X1,Y1]:=kolor;
           if (X1<=Image.Bitmap.Height-1) and (X1>=0) and (Y1>=0) and (y1<=Image.Bitmap.Width-1) then
              tablica_punktow[x1,y1]:=1;
       end;
    for j:= 1 to (Image.Bitmap.Width-2) do
       for i := 1 to (Image.Bitmap.Height-2) do
       begin
           if (tablica_punktow[j,i]=0) then
           begin
               r1:=0;r2:=0;r3:=0;r4:=0;r5:=0;r6:=0;r7:=0;r8:=0;
               g1:=0;g2:=0;g3:=0;g4:=0;g5:=0;g6:=0;g7:=0;g8:=0;
               b1:=0;b2:=0;b3:=0;b4:=0;b5:=0;b6:=0;b7:=0;b8:=0;
               ilosc:=0;
               if tablica_punktow[j-1,i-1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j-1,i-1];
                   r1:=getRvalue(kolor_sasiada);
                   g1:=getGvalue(kolor_sasiada);
                   b1:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j-1,i]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j-1,i];
                   r2:=getRvalue(kolor_sasiada);
                   g2:=getGvalue(kolor_sasiada);
                   b2:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j-1,i+1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j-1,i+1];
                   r3:=getRvalue(kolor_sasiada);
                   g3:=getGvalue(kolor_sasiada);
                   b3:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j+1,i-1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j+1,i-1];
                   r4:=getRvalue(kolor_sasiada);
                   g4:=getGvalue(kolor_sasiada);
                   b4:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j+1,i]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j+1,i];
                   r5:=getRvalue(kolor_sasiada);
                   g5:=getGvalue(kolor_sasiada);
                   b5:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j+1,i+1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j+1,i+1];
                   r6:=getRvalue(kolor_sasiada);
                   g6:=getGvalue(kolor_sasiada);
                   b6:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j,i-1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j,i-1];
                   r7:=getRvalue(kolor_sasiada);
                   g7:=getGvalue(kolor_sasiada);
                   b7:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if tablica_punktow[j,i+1]<>0 then
               begin
                   kolor_sasiada:=Image.Bitmap.Pixels[j,i+1];
                   r8:=getRvalue(kolor_sasiada);
                   g8:=getGvalue(kolor_sasiada);
                   b8:=getBvalue(kolor_sasiada);
                   ilosc:=ilosc+1;
               end;
               if ilosc>=5 then
               begin
                   r_srednie:=(r1+r2+r3+r4+r5+r6+r7+r8) div ilosc;
                   g_srednie:=(g1+g2+g3+g4+g5+g6+g7+g8) div ilosc;
                   b_srednie:=(b1+b2+b3+b4+b5+b6+b7+b8) div ilosc;
                   kolor_sasiada:=RGB(r_srednie,g_srednie,b_srednie);
                   Image.Bitmap.Pixels[j,i]:=kolor_sasiada
               end;
           end;
       end;
end;
</delphi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1