Chcel by som sa spytat ci by sa nedalo rychlesie pracovat s pixelmi za pomoci VCL kniznice. Klaciky pristup cez Canvas pripadne Bitmapu je dost pomaly ked pracujem s obrazkami s velkym rozlisenim.
Fórum › C / C++
Praca s pixelmi v Turbo C++
pokud je pomala i prace primo v bitmape tak budes mit bud uzasne neefektivni zpracovani nebo silene pomalej komp
bitmapa v pameti je vicemene jen pole bajtu v ram...
To KIIV :
Graphics::TBitmap *bmp;
Graphics::TBitmap *bmp2;
bmp = new Graphics::TBitmap;
bmp2 = new Graphics::TBitmap;
bmp->LoadFromFile("C:\\3.bmp");
int x, y;
for (y=0; y<bmp->Height; y++){
for (x=0; x<bmp->Width; x++){
bmp2->Canvas->Pixels[x][y]=bmp->Canvas->Pixels[x][y];
}
}
bmp2->Free();
bmp->Free();
Pouzivam tento postup a je to dost pomale(program caka asi 3sec), obrazok ma rozlisenie 1680x1050, moj PC AMD X2 4000+, 2GB RAM... kde mam problem? je to sposobene pomalostou GDI ?
To o-lox :
To viem :) ale s tym nemozem robyt graficke efekty ako ked pristupujem do Bitmapy pomocou pixelov.
To viem já znám vše od Bratislavy po Košice , do helpu sa pozerám ale ostatní mi musejí říct co to mám vidět, nebo jak ? ;=]
TBitmap tam má snad ScanLine, ten to mnohonásobně zrychlí, možná zjistíš, jak jsou řádky uloženy za sebou a nebudeš muset volat scanline pro každou zvlášť.
Pro celkové kopírování můžeš použít ne-VCL GetDibits,setbitmapbits mimo VCL v bažině neutoneš, to ti garantuju.
To o-lox : Lenze ja potrebuje pristupovat ku danemu pixelu zvlast, napr. potrebuejm urobit algoritmus zoomu obrazkov... mimo VCL robit neviem, v delhpi som na to pouzival DelphiX tam to bolo velmi rychle...
Rezignuji - možná mi pošli co chceš urobit a já to napíšu celé, to nebude problem :D
Když něco neumim snažim se to naučit !
Někdo pod tebou využívá na 2D > open source Qt4.4, nebo máš rovnou DirectX, a i OpenGl.
Jen od oka jsem střelil neefektivně toto (odladil, krásně zoomuje *2)
type pole=array [0..1000000]of byte;
var
p:pointer;
b,b2:^pole;
sirka,posun,x:integer;
b1:tbitmap;
...
for i:=0 to image1.width div 2 do
for j:=0 to image1.height div 2 do
begin
p:=b1.scanline[j*2];
b2:=p;
for a:=0 to 2 do begin
b^[i*3*2+j*image1.width*3*2+a]:=b2^[i*3+a];
b^[i*3*2+3+j*image1.Width*3*2+a]:=b2^[i*3+a];
b^[i*3*2+3+(2*j+1)*image1.width*3+a]:=b2^[i*3+a];
b^[i*3*2+(2*j+1)*image1.Width*3+a]:=b2^[i*3+a];
end;
end;
for i:=0 to image1.height do
begin
p:=b1.scanline[i];
b2:=p;
for x:=0 to image1.width*3 do
b2^[x]:=b^[i*image1.width*3+x];
end;
image1.Picture.Bitmap:=b1;
form1.repaint;
Jde to nakrásně zrychlit použitim proměnných místo odkazů z image1.width
Ani jsem si nevšiml že jedu v Delphi ;-)
(a navic scanline necha oblast v pameti, takze ti pro pristup read-write ke vsem pixelum staci jedine jednocestne prosvisteni vsema radkama na startu a ne jak to delam ja)
To o-lox : Ja nie som zas moc dobry programator, ovladam dost dobre syntax C/C++ a Pascalu ale v kniznicach a ich funkciach sa moc dobre nevyznam. Ja potrebuje robit nejaky efekty s grafikov, napr. sum, pracu s RGB a pod. ked som nasiel nejake navody na to na internete tak vzdy sa tam vyuzivali pixely. Daju sa robit graficke efekty aj s funkcoiu ScanLine ?
alebo napr. funkcia v skicary, ze sa vyfarbi pred tym nakresleny tvar zadanou farbou...
No ano snažil, jsem se to naznačit staci ti vyndat na zacatku do pole ypsilonu skrz scanline
vsechny radky
BYTE* XY[1024]; //1024 pocet radek pri 1280*1024
for (i=0;i<1024;i++)
XY[i]=Scanline[i]; // ukazatel na kazdy radek obrazku
ted XY[y][3*x] ukazuje na pixel na pozici xy, protoze musis si uvedomit, ze je 3 bytovy
BGR. Muzes to udelat i pres strukturu {BYTE r,g,b;} to se mi zda i lepsi.
struct { BYTE r,g,b; }* XY[1024];
Co je nepochopitelne na GetDIBits ??
pouzivam to osobne takto pro predani pointeru na graficka data
setbitmapbits(bkbmp,640*480*4,videop);
nebo
GetDIBits(backgrounddc,bkbmp,0,480,videop,@bmii,dib_rgb_colors);
Musis davat pozor jaka ta bitmapa je, VCL ji vytvari snad
normalne jako Device independent DI - GetDIbits SetDIBits funkce misto Getbitmapbits.
Ale nerucim ti za to 100% (jen co si tak pamatuju).
Z tohohle už si něco vyber začni makat a házej sem konkrétní dotazy nebo mne chytne amok.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Turbo c++ clipboard? — založil
Turbo pascal? — založil to_jsem_ja
Turbo Pascal — založil doma22
Turbo a TinyXML — založil Scorpiusix
Scanline v Turbo C++ 2006 — založil Tomas
Moderátoři diskuze