Obracanie obrazka TIMAGE

Odpowiedz Nowy wątek
2004-07-07 19:52
0

1.Jak przerzucic w pionie lub poziomie jakis obrazek??

  1. jak obrocic jakis obrazek o kąt

Gdyby wszystko by

Pozostało 580 znaków

2004-07-07 20:06
0

najprostrzy sposob na obrot obrazka o 180 stopni jest:
np mama czerwny punkt(3,4). to w naszym drugim obrazie bedzie to (4,3). robimy to z kadym punktem. Czyli tylko 2 petelki, i koniec. nie chce mi sie myslec, to ci nie bede pisal teraz kodu:P

Pozostało 580 znaków

2004-07-07 20:11
hitman
0

mi chodzi o cały obrazek nie o punkt

Pozostało 580 znaków

2004-07-07 20:26
0

bite

procedure OdbijWPoziomie(Bitmapa : TImage);
var
  bmp2: TBitmap;
  x, y: integer;
  linia: PByteArray;
begin
  bmp2:=TBitmap.Create;
  bmp2.PixelFormat:=pf24bit;
  bmp2.Width:=Bitmapa.Picture.Bitmap.Width;
  bmp2.Height:=Bitmapa.Picture.Bitmap.Height;
  for y:=0 to bmp2.Height-1 do
  begin
    linia:=Bitmapa.Picture.Bitmap.ScanLine[y];
    for x:=0 to bmp2.Width-1 do
    bmp2.Canvas.Pixels[(bmp2.Width-1)-x,y]:=RGB(linia[x*3+2], linia[x*3+1], linia[x*3]);
  end;
  Bitmapa.Picture.Bitmap.Assign(bmp2);
  bmp2.Free;
end;

procedure OdbijWPionie(Bitmapa : TImage);
var bmp2: TBitmap;
    x, y: integer;
    linia: PByteArray;
begin
  bmp2:=TBitmap.Create;
  bmp2.PixelFormat:=pf24bit;
  bmp2.Width:=Bitmapa.Picture.Bitmap.Width;
  bmp2.Height:=Bitmapa.Picture.Bitmap.Height;
  for y:=0 to bmp2.Height-1 do
  begin
    linia:=Bitmapa.Picture.Bitmap.ScanLine[y];
    for x:=0 to bmp2.Width-1 do
    bmp2.Canvas.Pixels[x,(bmp2.height-1)-y]:=RGB(linia[x*3+2], linia[x*3+1], linia[x*3]);
  end;
  Bitmapa.Picture.Bitmap.Assign(bmp2);
  bmp2.Free;
end;

Pozostało 580 znaków

2004-07-08 01:45
0

popracowałem troszkę nad tymi procedurami i powstały mi funkcje :P

function TForm1.OdbijWPionie(Bitmapa: TBitmap): TBitmap;
var
  x, y: integer;
begin
  Result:=TBitmap.Create;
  Result.PixelFormat:=pf24bit;
  Result.Width:=Bitmapa.Width;
  Result.Height:=Bitmapa.Height;
  for y:=0 to Result.Height-1 do
  begin
    for x:=0 to Result.Width-1 do
      Result.Canvas.Pixels[(Result.Width-1)-x,y] := Bitmapa.Canvas.Pixels[x,y];
  end;
end;

function TForm1.OdbijWPoziomie(Bitmapa: TBitmap): TBitmap;
var
  x, y: integer;
begin
  Result:=TBitmap.Create;
  Result.PixelFormat:=pf24bit;
  Result.Width:=Bitmapa.Width;
  Result.Height:=Bitmapa.Height;
  for y:=0 to Result.Height-1 do
  begin
    for x:=0 to Result.Width-1 do
      Result.Canvas.Pixels[x,(Result.Height-1)-y] := Bitmapa.Canvas.Pixels[x,y];
  end;
end;

a po co jest to ScanLine?
A swoją droga to ciekawe jest to obracanie o kąt ;)

Pozostało 580 znaków

2004-07-08 09:03
0

omikron87 - Porównaj czasy wykonywania Twojego kodu z kodem Bełdzia, np na bitmapie 1024x768.


Pozostało 580 znaków

2004-07-08 18:22
0

Kurcze! Rzeczywiście! 3 i pół raza szybciej się wykonuje, no ale jak to działa!?!? Dlaczego tak jest? Podoba mi się ten problem, a szczególnie z obracaniem obrazka o kąt. Jeśli będę wiedział dlaczego tak jest to to wykorzystam. Plis! Wytłumaczcie!
Pozdrawiam!!!

PS. testowałem na obrazku 1600x1200
moim sposobem było około 8 sekund
a sposobem Bełdzia niecałe dwie i pół

Dobra poradziłem sobie z tym ScanLine (niezawodne F1, sorki, że nie od razu).

Pozostało 580 znaków

2004-07-08 18:34
0

Powiem krótko funkcje trygonometryczne siem kłaniają :P
X? =x cos(a) - y sin(a);
Y? =x sin(a) + y cos(a);
Gdzie A to kąt w radianach.

Ps. Polecam zrobienie tablicy TCOS i TSIN o wymiarach 0..359 w których zapiszemy wartości odpowiednio sin i cos dla każdego kąta .

Tak nawiasem mówiąc nie trzeba wykonywać tych obliczeń dla każdego punktu bitmapy!!! Tzn. wystarczy wyliczyć obrót dla najdłuższej krawędzi :) czyli jeśli mamy 1024x768 to wykonujemy powyższy wzór tylko 1024 razy :) Wyobraźcie sobie wykonać obliczenia dla całości !! 1024*768 = 786432 różnice widać na oko :P


Nie ma ludzi zdrowych psychicznie, są tylko źle zbadani...

Pozostało 580 znaków

2004-07-08 18:37
0

2,5 sekundy to i tak dużo. Chodzi o to że podczas operacji na Pixels[x,y] za każdym razem gdy zmieniana jest wartość piksela odświeżana jest cała bitmapa, co zajmuje trochę czasu. Dla obrazka 1600x1200 odświeżanie wykonywane jest 1920000 razy, zupełnie niepotrzebie. Przy ScanLine robione jest to "tylko" 1200 razy - czytamy i zapisujemy linia po linii. Natomiast w większości przypadków wystarczyło by tylko raz - po zakończeniu operacji na pikselach. Niestety to już wymaga stosowania własnego sposobu na dostanie się do pikseli bitmapy.


Pozostało 580 znaków

2004-07-08 20:05
0

Ten kod jest nie patrzylem o co chodzi w tym kodzie, ale to co otrzymalem po jego uzyciu malo mialo wspolnego z odbij w pionie. Czy wam dziala ten kod?? (kod Bełdzia)

Pozostało 580 znaków

2004-07-08 21:15
0

Pewnie, że działa, ale trzeba wczytać bitmape, która ma 24bity!!!!!!!!!!!!! albo zmodyfikować kod

chodzi o tą linijkę:

//...
bmp2.PixelFormat:=pf24bit;
//...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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