Názory k článku
Řádkové filtry v PNG
Vykon
celé vláknoNevim jak je to v Xorg vyresene, ale pokud se pixely primo zapisuji do videoram po jednom, tak bude techto zapisu potreba vykonat mnoho a tedy i vykon bude velmi nizky, protoze by se musela pro efektivni vykreslovani pouzit metoda blokoveho zapisu (napriklad po celych radcich). Ted nevim, zda je to skutecne pouzitelne, jak zapsat najednou cely radek?
Re: Vykon
celé vláknoNo, operace typu putpixel() a getpixel() mohou byt obecne dost pomale, viz treba WinAPI funkce SetPixel() a GetPixel() - pomerne inteligentni, ale neskutecne pomale funkce. Vy vsak nemusite pracovat primo z obrazovou pameti, postaci si do bufferu ulozit maximalne dva obrazove radky a na nich tuto filtraci provadet. Pokud by byl v bufferu ulozen cely dekomprimovany obrazek, je naprogramovani putpixel() i getpixel() pro grayscale pixmapy pomerne jednoduche:
//-----------------------------------------------------------------------------
// Zmena barvy pixelu na zadanych souradnicich
//-----------------------------------------------------------------------------
void putpixel(pixmap *p,
const unsigned int x, // pozice pixelu v pixmape
const unsigned int y,
const unsigned char w) // barva pixelu
{
int pos;
// zde se vyuziva zkraceneho vyhodnoceni vyrazu - pokud plati !p, nic se dale netestuje
if (!p || !p->pixels || x>=p->width || y>=p->height) return;
pos=(x+y*p->width);
p->pixels[pos]=w;
}
//-----------------------------------------------------------------------------
// Precteni barvy pixelu na zadanych souradnicich
//-----------------------------------------------------------------------------
unsigned char getpixel(pixmap *p,
const unsigned int x,
const unsigned int y)
{
int pos;
// zde se vyuziva zkraceneho vyhodnoceni vyrazu - pokud plati !p, nic se dale netestuje
if (!p || !p->pixels || x>=p->width || y>=p->height) return 0;
pos=(x+y*p->width);
return p->pixels[pos];
}
prekladac by nemel mit problemy s "inliningem" techto funkci, pokud ano, staci prepsat do maker.
Dulezite je, ze se jedna POUZE o radkove (resp. "dvouradkove") filtry a to jeste o filtry realizovatelne "zleva-doprava", tj. presne ve smyslu nejrychlejsiho adresovani operacni pameti. Jine usporadani by melo dost podstatny vliv na vykonnost.
Lena
celé vláknoJelikož se odkaz nedostavil, přikládám jej zde - na plnou verzi fotky: http://www.lenna.org
Re: Lena
celé vláknoJenom pět filtrů ?
celé vláknoRe: Jenom pět filtrů ?
celé vlákno1. hodne s navrhem spechali, to je videt i na ne zrovna stastne volbe CRC polynomu. Takze vyber slozitejsich filtru, ktere by byly statisticky lepsi, se nekonal. Urcite ne v takovem rozsahu, jak to udelala CCITT pri navrhu faxovych protokolu, kde jsou zvoleny vylozene statisticke "filtry" (spis sekvence bitu) ziskane z mnoha tisicu dokumentu ruznych typu.
2. chteli co nejdrive funkcni implementace, potom zabihat do slozitych filtru s ruznymi okrajovymi podminkami by znamenalo, ze by spousta aplikaci nezvladala vsechny obrazky. Ze to neni utopie a i takovy SW existuje, je jasne pri pohledu na jeden dosti rozsireny webovy prohlizec :-)
Re: Jenom pět filtrů ?
celé vláknoTen problem s vyberom CRC polynomu sa predpokladam tyka tohoto: http://en.wikipedia.org/wiki/Cyclic_redundancy_check#Error_detection_strength_.28Bitfilters.29
Re: Jenom pět filtrů ?
celé vláknoRe: Jenom pět filtrů ?
celé vláknoRe: Jenom pět filtrů ?
celé vláknoNehlede na obrazky, ktere nekdo predtim ulozil do GIFu a aplikoval na ne dithering, to pouzite filtry ani deflate opravdu moc nerozchodi.
Zjištění použitého filtru
celé vláknoDobrý den, jestli to dobře chápu, je na každý řádek pixlů obrázku možno použít jiný filtr? Dost bych potřeboval nějáký program, který by vypsal čísla použitých filtrů. Nebo aspoň jak se to zjistí, na kterém je to bytu, nebo tak něco. takže když někdo použije na první řádku filtr 0, na druhou 2 a na třetí zase 0, tak aby mi to vypsalo 0,2,0.
Moc dík.

