Praca s pixelmi v Turbo C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Praca s pixelmi v Turbo C++ – C / C++ – Fórum – Programujte.comPraca s pixelmi v Turbo C++ – C / C++ – Fórum – Programujte.com

 

Tomas
~ Anonymní uživatel
560 příspěvků
12. 2. 2009   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 87.244.226.–
KIIV
~ Moderátor
+43
God of flame
12. 2. 2009   #2
-
0
-

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...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
12. 2. 2009   #3
-
0
-

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 ?

Nahlásit jako SPAM
IP: 87.244.226.–
o-lox0
Super člen
12. 2. 2009   #4
-
0
-

První co udělám, že se nalinkuju do nápovědy ke Canvasu a všimnu si že má rychlejší CopyRect, BrushCopy pro větší oblasti.
Pak nemusim hledat pointer přímo ukazující na každý pixel a vyhýbat se tak VCL objektům.

Nahlásit jako SPAM
IP: 85.71.152.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
12. 2. 2009   #5
-
0
-

To o-lox :
To viem :) ale s tym nemozem robyt graficke efekty ako ked pristupujem do Bitmapy pomocou pixelov.

Nahlásit jako SPAM
IP: 87.244.226.–
o-lox0
Super člen
12. 2. 2009   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 85.71.152.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
13. 2. 2009   #7
-
0
-

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...

Nahlásit jako SPAM
IP: 87.244.226.–
o-lox0
Super člen
13. 2. 2009   #8
-
0
-

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)

Nahlásit jako SPAM
IP: 85.71.152.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
15. 2. 2009   #9
-
0
-

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...

Nahlásit jako SPAM
IP: 87.244.226.–
o-lox0
Super člen
15. 2. 2009   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 85.71.152.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 64 hostů

Podobná vlákna

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý