26. juli 2007 - 18:34Der er
6 kommentarer og 1 løsning
RGB data, endianness - kan det gøres smartere ?
Jeg læser nogle billedfiler, der indeholder billeddata i råt RGB format.
Hvis jeg blot tager selve billeddataene jeg kan finde i filen, og kopierer til et System.Drawing.Bitmap; er der byttet rundt på farverne rød og blå. Jeg er ret sikker på at det skyldes at hardwaren filerne er lavet på kører big-endian.
Det betyder at jeg er nødt til at bytte rundt på de læste bytes, før jeg kan komme frem til et brugbart billede, hvilket jeg gør således:
public static void ChangeTripletEndinanness(byte [] buffer) { if ( buffer == null ) throw new ArgumentNullException("buffer");
if ( buffer.Length % 3 != 0 ) throw new ArgumentException("Buffer length must be a multiple of 3");
byte b; for(int index = 0 ; index < buffer.Length ; index += 3) { b = buffer[index]; buffer[index] = buffer[index + 2]; buffer[index + 2] = b; } }
Spørgsmålet er nu: Kan det gøres nemmere / hurtigere ? Performance er et issue, så jeg er interesseret i at operationen skal tage så kort tid som muligt.
Jeg har antaget at det bedste er at indlæse en buffer fra filen, bytte rundt på bytes og skrive til mit resultat billede - fremfor at læse 3 bytes af gangen og lave ombytningen her.
Tak for forslaget arne. Jeg har kigget lidt på Array.Reverse; hvilket i dette tilfælde giver marginalt dårligere performance end min egen metode. Jeg antager at det skyldes at jeg skal kalde Array.Reverse for hver triplet; dvs. der er mere overhead til funktionskald.
Jeg har også kigget på Array.Reverse i Reflector, og den gør stort set det samme som min kode. Udover at den først forsøger at kalde en ekstern metode "TrySZReverse"; som i teorien kunne være en mere effektiv implementation - men jeg tvivler.
Andre forslag er velkomne, men ellers lukker jeg spørgsmålet i løbet af et par dage. arne_v, du må gerne lægge et svar; så du kan få del i points.
Inden man begynder alt for meget at rode i bud osv... så vil det være rart at vide lidt mere om filen gennerelt...
Der må vel være noget HeaderData ect. i filen?... eller lign... for lurede lidt på om man kunne arve fra en BinaryReader og på den måde evt. spare nogle motodekald samt det at flytning af den buffer du arbejder med, og så bare arbejde direkte på den underligende Streams Buffer...
Men det vil kræve en grundig forståelse af hvordan filen er bygget op...
Jeg havde lidt luret på at en unsafe version ville være hurtigere, da man sparer bounds checket; men den er ikke så meget hurtigere at det kan forsvares, i mit tilfælde.
md_craig >> Godt forslag.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.