Richard87 Skrevet 12. januar 2011 Del Skrevet 12. januar 2011 (endret) Hei, jeg jobber med et programm for å finne ut den mest fremmhevede fargen i ett bilde(eller i 9 forskjellige regioner). Men resulatet blir svart/grått uansett (33,33,33).... Her er koden min 'lWitch = hvilken region som skal kalkuleres, bOrg er det orginale bitmapet Private Function CalculateColorFromRect(ByVal lWitch As Long, ByVal bOrg As Bitmap) As Color Dim c As Color = Color.FromArgb(0, 0, 0) ' black Dim rect As Rectangle = CreateRect(lWitch, bOrg) Dim bWork As Bitmap = bOrg.Clone(rect, PixelFormat.Format24bppRgb) Dim bData As BitmapData = bWork.LockBits(New Rectangle(0, 0, bWork.Width, bWork.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb) Dim ptr As IntPtr = bData.Scan0 Dim bytes As Long = bData.Stride * bWork.Height Dim byteData(bytes) As Byte System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, bytes) Dim red As Long, bR As Byte Dim blue As Long, bB As Byte Dim green As Long, bG As Byte Dim x As Long Try For x = 0 To bytes Step 3 If x + 3 > bytes Then Exit For End If blue += (byteData(x)) red += (byteData(x + 2)) green += (byteData(x + 1)) Next Catch ex As Exception Return Color.FromArgb(0, 0, 0) End Try bR = CByte(red / bytes) bB = CByte(blue / bytes) bG = CByte(green / bytes) Return Color.FromArgb(bR, bG, bB) bWork.UnlockBits(bData) Return c End Function Bildet som jeg tester med er vedlagt (helt enkelt rødt(235,33,28 sånn ca..) ) red.bmp Endret 13. januar 2011 av Richard87 Lenke til kommentar
Richard87 Skrevet 12. januar 2011 Forfatter Del Skrevet 12. januar 2011 (endret) Ok, fant ut at jeg måtte legge på *3 når jeg regnet ut antall bytes... Jeg lurer ennå på hvorfor bytene er i feil rekkefølge? BGR istedenfor RGB?? [EDIT] Okay, etter masse debugging og ett bilde på 10x10 piksler, så begynner det greit, men etter 39 byte(eller noe) så forandres rekkefølgen?? :O :O Akkuratt nå er jeg uten ideer totalt :S (PS. jeg må ikke legge på *3 når jeg bruker stride og ikke width.... ) Endret 12. januar 2011 av Richard87 Lenke til kommentar
Richard87 Skrevet 12. januar 2011 Forfatter Del Skrevet 12. januar 2011 (endret) ok, etter endel leting fant jeg ut at bitmapdata.stride ikke = bwork.length * 3, men inkluderer en 'padding', så når jeg jobber med et bilde med en bredde på 3piksler = 9 byte, får jeg en 'padding' på 3 byte... :O Noen ideer hvordan jeg hoppe over 3 byte når jeg har gåt igjennom 9 byte på en elegant måte? [EDIT] og her e resultatet av den elegante metoden min: :S For y = 0 To bWork.Height - 1 If y = 0 Then ptr = bData.Scan0 Else ptr = ptr + bData.Stride End If System.Runtime.InteropServices.Marshal.Copy(ptr, bytesdata, 0, lLine) For x = 0 To lLine - 1 Step 3 red += (bytesdata(x + 2)) green += (bytesdata(x + 1)) blue += (bytesdata(x)) Next Next Endret 12. januar 2011 av Richard87 Lenke til kommentar
GeirGrusom Skrevet 15. januar 2011 Del Skrevet 15. januar 2011 Går det tregere å bruke GetPixel? Ser at C# er en del bedre egnet til slike ting. Ettersom du har pekere, så slipper du hele Copy funksjonen. Skjermkortet vil ofte lagre i BGRA istedet for RGBA. Jeg tror det er mer eller mindre vilkårlig. BMP lagrer også i BGRA og ikke i RGBA. Lenke til kommentar
Richard87 Skrevet 15. januar 2011 Forfatter Del Skrevet 15. januar 2011 Hei Ja, har brukt GetPixel tidligere, men denne er alt for treg... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå