Mám tři knihovny na načítání obrázků. Funkce libjpeg začíná takto:
bool read_jpg_file(pJPEG_DATA data)
{
data->row_bytes_len = data->d_info.output_width * (data->d_info.output_components);
data->pRowsArray = (data->d_info.mem->alloc_sarray)
((j_common_ptr) &data->d_info, JPOOL_IMAGE, data->row_bytes_len, 1);
size_t counter=0;
data->image_buffer =
(unsigned char*) malloc( data->channels * data->width * data->height );
while (data->d_info.output_scanline < data->d_info.output_height)
{
(void) jpeg_read_scanlines(&data->d_info, data->pRowsArray, 1);
for( a=0; a<data->row_bytes_len ; a+=c)
{
Něco podobného je i u lipng, tak že zdroj se načítá po řádcích. Funkce výše alokuje paměť pro celý obraz rgb a pak ho procházím a provádím rgb2hsv. Celé to zabere jen zlomek vteřiny. To samé u png, i když tam je smyčka která prochází dvourozměrým polem. Tedy existuje pole pointerů, která odkazuje na jednotlivé řádky a to se pak prochází
for (y=0; y<data->height; y++)
{
for (x=0; x<data->row_bytes_len; x=x+c)
{
if( !data->row_pointers[y][x+1] ) {
// set all values to V
data->row_pointers[y][x]=data->row_pointers[y][x+2];
data->row_pointers[y][x+1]=data->row_pointers[y][x+2];
continue;
}
H=(float) data->row_pointers[y][x];
S=(float) data->row_pointers[y][x+1];
V=(float) data->row_pointers[y][x+2];
...
Opět kód zabere jen malou chvilku, i když záleží to na typu obrazu.
Mluvím o rgb obrazu o rozměrech 4096x4096 px.
No a nyní mám knihovnu, která pracuje s bmp a ta načte vše do jednoho bufferu a trvá to 10s což je extrémně dlouhá doba. Tak se chci zeptat jestli nevíte proč, co bych mohl udělat aby se to časově přiblížilo k těm dvouma nahoře. Načtení bitmapy proběhne bleskově, ale ten proces zpracování trvá hodně dlouho. Chyba v kódu konverze by určitě být neměla. Kód začíná...
void bmp_rgb2hsv(BMPFILE * bmpfile)
{
float R, G, B, H, S, V,min, max, delta, rev_delta;
H=S=V=0;
uint32_t c = bmpfile->channels;
uint32_t a;
for (a=0; a < bmpfile->dib.raster_size; a+=c)
{
R=(float) bmpfile->buffer[a];
G=(float) bmpfile->buffer[a+1];
B=(float) bmpfile->buffer[a+2];
...
... jen jedna smyčka, která se navyšuje o 3 v každém cyklu. Vstupní hodnoty jsou samozřejmě správné