Jak pracovat s bufferem s pixely – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak pracovat s bufferem s pixely – C / C++ – Fórum – Programujte.comJak pracovat s bufferem s pixely – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
oxidián0
Věrný člen
29. 1. 2015   #1
-
0
-

Mám program který načítá data ze souboru jpg. Čtecí smyčka dělá toto:

  while (cinfo.output_scanline < cinfo.output_height) {
    (void) jpeg_read_scanlines(&cinfo, buffer, 1);
    // tady potřebuju zpřístupnit buffer[0] pro čtení a pak pro zápis
    memcpy(image_buffer+counter, buffer[0], raw_size);

    // případně použít image_buffer zde, ten je unsigned char
    counter += row_stride_len;

 }

Data v buffer[0] jsou v RGB, tedy vždy jeden komponent*3 * šířka obrazu.

Zajímá mě jak získat hodnotu která je uložená v konkrétním pixelu v daném komponentu (tedy v konkrétním kanálu.

Jde mi o to, že ten zásobník chci překonvertovat do HSV. Na to mám funkci

void RGBtoHSV( float R, float G, float B, float *H, float *S, float *V )

takže potřebuju abych do funkce dostal číslo typu float, ale do zásobníku musím zapsat zase v tom formátu v jakém to bylo, tj. unsigned char (vlastně si tím nejsme jistý, ale image_buffer je určitě unsigned char).

Nahlásit jako SPAM
IP: 78.45.199.–
Reklama
Reklama
q
~ Anonymní uživatel
219 příspěvků
29. 1. 2015   #2
-
0
-

Délka pro memcpy by asi měla být row_stride_len. A pokud teda všechny ty hodnoty budeš hned konvertovat, tak asi ani nemá smysl to tam kopírovat.

Jinak nechápu v čem je problém. Máš tam ty jednotlivé bajty, se kterými si můžeš dělat, co chceš. Předpokládám, že ty floatové parametry mají být v rozsahu 0.0 až 1.0.

byte bR = input[pixel * 3 + 0];
byte bG = input[pixel * 3 + 1];
byte bB = input[pixel * 3 + 2];

float fR = (1.0f / 255) * bR;
float fG = (1.0f / 255) * bG;
float fB = (1.0f / 255) * bB;

float fH, fS, fV;
RGBtoHSV(fR, fG, fB, &fH, &fS, &fV)

byte bH = (byte)(fH * 255); // mozna zaokrouhlit?
byte bS = (byte)(fS * 255);
byte bV = (byte)(fV * 255);

output[pixel * 3 + 0] = bH;
output[pixel * 3 + 1] = bS;
output[pixel * 3 + 2] = bV;
Nahlásit jako SPAM
IP: 78.156.159.–
oxidián0
Věrný člen
29. 1. 2015   #3
-
0
-

Zdá se mi to ale moc složité ty matematické operace, není to zbytečné? Asi bych mohl použít jen  RGBtoHSV((float)R,(float)G,(float)B,...) a to by bylo rychlejší

Nahlásit jako SPAM
IP: 78.45.199.–
q
~ Anonymní uživatel
219 příspěvků
29. 1. 2015   #4
-
0
-

Předpokládám, že ty floatové parametry mají být v rozsahu 0.0 až 1.0.

Nahlásit jako SPAM
IP: 213.211.51.–
q
~ Anonymní uživatel
219 příspěvků
29. 1. 2015   #5
-
0
-

Tak jsem na to koukal a H je zřejmě 0..360, ale ostatní hodnoty by měly sedět i bez přepočítávání.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Věrný člen
29. 1. 2015   #6
-
0
-

Aha to mě nenapadlo. Ale uvědomil jsem si, že ten kód z funkce RGB2HSV přesunu přímo do té smyčky protože tím se urychlí zpracování

statistika čtení souboru JPG 301kb s funkcí RGB2HSV:

raw size:2359296

average reading time: 0.0422 s

bez funkce (přímý zápis):

average reading time: 0.0326 s

takže skoro o 1/4 se to urychlí.

Jinak žádný další převod kromě toho castu není třeba, je to v RGB a algorytmus převodu na HSV se sám stará o převody.

Nahlásit jako SPAM
IP: 78.45.199.–
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, 56 hostů

Podobná vlákna

Jak pracovat s dvěma poli — založil Paja2

Moderátoři diskuze

 

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