Uszybszenie procedury ...

Uszybszenie procedury ...
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

Mam procedure konwertującą imaga na grayscale (zara jom podam) i chodzi mi oto żeby była szybsza a naprawde długo sie robi! przy 1024 na 768 nawet sporo trwa!!! dało by sie na assemblera przeżucić?

[code]
procedure Grayscale(rysunek:timage);
var i,j:word;
function RgbToGray(RGBColor : TColor): TColor;
var
Gray : byte;
begin
Gray := Round((0.30 * GetRValue(RGBColor)) + (0.59 * GetGValue(RGBColor)) + (0.11 * GetBValue(RGBColor)));
Result := RGB(Gray, Gray, Gray);
end;

begin
for i:=1 to rysunek.width do
for j:=1 to rysunek.height do
rysunek.Canvas.Pixels[i,j]:=rgbtogray(rysunek.canvas.pixels[i,j]);
end;

[/code]
tak to mniej więcej wygląda :-|

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 384
0

Lepiej konwertuj na buforze a potem tylko wrzuć na ekran

--

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

ale jaaak? chodzi mi o przykład!

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam procedure konwertującą imaga na grayscale (zara jom podam) i chodzi mi oto żeby była szybsza a naprawde długo sie robi! przy 1024 na 768 nawet sporo trwa!!! dało by sie na assemblera przeżucić?

Czy to jest bitmapa? Jeżeli to bitmapa to możesz to znacznie przyspieszyć stosując ScanLine (nawet do 20 razy szybciej).

A jeszcze coś. Zastąp Round przez Trunc. I dlaczego takie dziwne liczby? Nie łatwiej średnia arytmetyczna z barw? (i tak dosyć zbliżone).

Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC: #4programmers, warszawa.ircnet.pl (POLNet)

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

tiaa próbowałem ale jakoś mi nieidzie
raz mi wyżucił błąd że scanline jest do odczytu i w ogóle:(

Proosze moja przeglądarka graficzna potrzebuje tego;)

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

tiaa próbowałem ale jakoś mi nieidzie
raz mi wyżucił błąd że scanline jest do odczytu i w ogóle:(

Proosze moja przeglądarka graficzna potrzebuje tego;)

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

W dziale Algorytmy pisałem przy rozjaśnianiu o ScanLine:
http://www.4programmers.net/view.php?id=94

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC: #4programmers, warszawa.ircnet.pl (POLNet)

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

Nic mi to niepomogło ale i tak doszły mi dwie procki:)

Ale na pewno nic szybszeko nieda sie zrobić z tych procedur z artykułu?

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 384
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

ale i tak trzeba pixels[i,j] :( więc i tak bedzie wolno

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 384
0

ale narysuje się szybko na ekranie ;]
chyba oczywiste ;]

--

SH
  • Rejestracja: dni
  • Ostatnio: dni
0

I dlaczego takie dziwne liczby? Nie łatwiej średnia arytmetyczna z barw? (i tak dosyć zbliżone).

Takie dziwne liczby to współczynniki na podstawie których określany jest sygnał luminancji w sygnałach telewizyjnych. Jakby przyjąć że sygnał lumiancji to Y i dodać jeszcze U=0,493(B-Y) oraz V=0,877(R-Y) gdzie B to nasycenie barwy niebieskiej, a R czerwonej, to mamy składowe sygnału PAL :)

--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

Ale tak jest szybciej bo tylko jedno dzielenie (ja i tak ślepy i w większości przypadków nie widzę różnicy :) ). Jakże subtelne różnice są przy użyciu tej metody w porównaniu z:
Gray := (RGBColor.Red + RGBColor.Green + RGBColor.Blue) div 3;
A w tym wypadku nie ma w ogóle operacji na liczbach zmiennoprzecinkowych.

A co do procedury to proszę. Jeżeli tylko mamy do czynienia z Bitmapą to to jest naprawdę najszybszy znany mi sposób:

procedure Grayscale(Rysunek: TImage);

type TTriple = record
Blue, Green, Red: Byte;
end;
type PLinia = ^TLinia;
TLinia = array [Word] of TTriple;

procedure RgbToGray(var RGBColor : TTriple);
var
Gray: Byte;
begin
Gray := Trunc(0.30RGBColor.Red + 0.59RGBColor.Green + 0.11 * RGBColor.Blue);
RGBColor.Red := Gray;
RGBColor.Green := Gray;
RGBColor.Blue := Gray;
end;

var
i, j: Word;
Linia: PLinia;
begin
for j:= 0 to Rysunek.Picture.Bitmap.Height-1 do
begin
Linia := Rysunek.Picture.Bitmap.ScanLine[j];
for i := 0 to Rysunek.Picture.Bitmap.Width-1 do
RGBToGray(Linia[ i ]);
end;
Rysunek.Repaint;
end;

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC: #4programmers, warszawa.ircnet.pl (POLNet)

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

O działa!:)

Niewiem jak wam dziękować [hurra]

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

Ej a da sie to zrobić z jpegiem na imagu?

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 384
0

Ej a da sie to zrobić z jpegiem na imagu?

A da się:

uses jpeg
var obrazek : TGraphic;
i w create
obrazek:=TJPEGImage.Create
i obrazek.Loadformfile('costam.jpg');

--

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

czyli to wczyta jako bitmape z możliwością modyfikacji tak?

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

hmm po długim testowaniu dzięki temu moge konwertować jpegi na bitmapy. myśle że metafilsy i wmfy też tak sie da (o to mój sposub):

if savedialog1.execute then begin
saveimg.Picture.Graphic:=rysunek.picture.graphic;
saveimg.Picture.SaveToFile(savedialog1.filename+'.bmp');
end;

po wczesnym stworzeniu tgrapica jako jpega :P

HEHEHEHEHE jak ktoś chce całą przeglądarke graficzną to niech pisze na gg:P

--
Najpierw wypróbuj wszystkie możliwości potem pytaj;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.