Często pisząc jakiś program korzystam z Canvas->Pixels. Jak każdy wie korzystanie z tego sposobu zajmuje wiele czasu. Dlatego też postanowiłem napisać własną procedurę obsługującą piexle. Oto i te procedury:
<font color="blue">void __fastcall Setpixel(int x, int y, TColor value)
{
_EAX=line[y];
asm {
mov ebx,x
imul ebx,3
add eax,ebx
mov ebx,value
mov [eax+2],bl
mov [eax+1],bh
shr ebx,16
mov [eax],bl
}
}
TColor __fastcall Getpixel(int x, int y)
{
_EBX=line[y];
asm {
mov eax,x
imul ax,3
add ebx,eax
mov ecx,[ebx]
mov eax,ecx
mov ah,0
shl eax,16
mov bx,cx
mov ax,bx
shr ecx,16
mov al,cl
}
}</span>Można też dodać:
<font color="blue">__property TColor pixel[int x][int y] = { read=Getpixel, write=Setpixel };</span>
Przed korzystaniem z nich należy najpierw wypełnić tablicę line[]:
<font color="blue">unsigned int* line =new unsigned int[bitmap->Height+2]; // to 2 zawszę dodaję dla bezpieczeństwa
bitmap->PixelFormat=pf24bit; // procedury działają poprawnie tylko przy 24bit głębi!
for (int a=0;aHeight;a++)
line[a]=(unsigned int) bitmap->ScanLine[a];</span> bitmap oznacza bitmapę (np. Image1->Picture->Bitmap).
Nie są to może doskonałe funkcje, ale działające znacznie szybciej niż Canvas->Pixels.
Kod nie ma żadnych zabezpieczeń (np. sprawdzanie x,y), gdyż zależało mi wyłącznie na prędkości.
Na przeprowadzonych testach wywołanie Canvas->Pixels[x][y]=Canvas->Pixels[x][y] ok. 3500000 razy zajęło 25 sekund. Analogiczny test z wykorzystaniem moich funkcji zajął 0,11 sekundy! (nie licząc czasu potrzebnego na zainicjalizowanie tablicy line[]).
UWAGA: TAKI DOSTĘP DO PIELI MOŻNA WYKORZYSTAĆ TYLKO W PRZYPADKU BITMAP 24-BITOWYCH! DLA INNYCH ROZDZIELCZOŚCI NALEŻY POZMIENIAĆ TROCHĘ KOD!
Na koniec jeszcze jedno: nie znam się za dobrze na programowaniu, więc w przypadku zauważenia jakichkolwiek błędów proszę o wyrozumiałość. Jeżeli jest ktoś zainteresowany innymi rozdzielczościami mogę mu przesłać kod mailem.
Jeżeli ktoś zna jakiś szybszy sposób bardzo bym prosił o kontakt: [email protected]
<font color="blue"></span><font color="green"></span><font color="green"></span><font color="green"></span>