Gå til innhold

[LØST]Gjennomsnitts farge resultatet blir alltid grått :S


Anbefalte innlegg

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 av Richard87
Lenke til kommentar
Videoannonse
Annonse

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 av Richard87
Lenke til kommentar

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 av Richard87
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...