Finns det någon metod för att kontrollera vilka RGB värden en speciell punkt i en picturebox har. <code> Ja men vill man ha roligt kan man alltid göra så här...... Det är roligare att lösa problemen själv.... Det är ibland lite jobbit att fatta API för ovana programmerare.... Så se mitt förslag som ett alternativ bara. Finns en inbyggd funktion: Det är inge särskilt effektiv sätt att göra det på... Men tack för ditt bidrag... Tack för dina synpunkter Andreas.... Jag är lite för fixerad vid optimering. Beror väl på att det ingår i min relion. Det är lugnt.... Enklast och utan APIRGB värden i en picturebox
MVH
JohanSv: RGB värden i en picturebox
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
GetPixel(Picture1.hdc, XX, YY)
</code>Sv: RGB värden i en picturebox
/peterh
Själv skulle jag ju använda API.....
==================================
Option Explicit
Option Base 1
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print "RR = "; getRGB(Picture1, X, Y)(1)
Debug.Print "GG = "; getRGB(Picture1, X, Y)(2)
Debug.Print "BB = "; getRGB(Picture1, X, Y)(3)
Debug.Print "RRGGBB = "; getRGBstr(Picture1, X, Y)
End Sub
Public Function getRGB(Obj As Object, X As Single, Y As Single) As Byte()
Dim RGB(3) As Byte
RGB(1) = CByte("&H" & Right(Hex(Obj.Point(X, Y)), 2))
RGB(2) = CByte("&H" & Mid(Hex(Obj.Point(X, Y)), 3, 2))
RGB(3) = CByte("&H" & Left(Hex(Obj.Point(X, Y)), 2))
getRGB = RGB()
End Function
Public Function getRGBstr(Obj As Object, X As Single, Y As Single) As String
getRGBstr = Right(Hex(Obj.Point(X, Y)), 2) & Mid(Hex(Obj.Point(X, Y)), 3, 2) & Left(Hex(Obj.Point(X, Y)), 2)
End FunctionSv: RGB värden i en picturebox
Dim Color as long
Color = Picture1.Point(X, Y)
Vill du sedan ha ut förgerna finns det två sätt att göra det på:
Snabbare sätt:
Private Type ColorRGB
Red As Byte
Green As Byte
Blue As Byte
End Type
Private Type ColorLong
Color As Long
End Type
Dim LongColor As ColorLong
Dim RGBColor As ColorRGB
LongColor.Color = Color
LSet RGBColor = LongColor
Eller det traditionella sättet:
Dim Color As Long
Dim Red As Byte
Dim Green As Byte
Dim Blue As Byte
Red = Color And vbRed
Green = (Color And vbGreen) \ &H100
Blue = (Color And vbBlue) \ &H10000Sv: RGB värden i en picturebox
Vill hjälpa dig skriva bättre kod. Så här är mina synpunkter:
* Funktionen hämtar värdet för pixelen tre gånger per anrop. Ett anrop och en variabel löser det.
* Konvertering av tal till hex kod görs tre gånger. Samma sak här ett anrop och en variabel löser det.
* Det går snabbar att arbeta med tal och logiska operationer än att använda sträng operationer.
* Vid användning av funktionen bör man använda en variabel och inte anropa den tre gånger.
* Anropet till Point sker med latebindings efter som variabeln är deklarerad som object
Option Explicit
Option Base 1
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim RGB() As Byte
RGB = getRGB(Picture1, X, Y)
Debug.Print "RR = "; RGB(1)
Debug.Print "GG = "; RGB(2)
Debug.Print "BB = "; RGB(3)
Debug.Print "RRGGBB = "; getRGBstr(Picture1, X, Y)
End Sub
Public Function getRGB(Obj As PictureBox, X As Single, Y As Single) As Byte()
Dim RGB(3) As Byte
Dim Color As Long
Color = Obj.Point(X, Y)
RGB(1) = Color And vbRed
RGB(2) = (Color And vbGreen) \ &H100
RGB(3) = (Color And vbBlue) \ &H10000
getRGB = RGB()
End Function
Public Function getRGBstr(Obj As PictureBox, X As Single, Y As Single) As String
getRGBstr = Hex(Obj.Point(X, Y))
End Function
/Mvh, Andreas HillqvistSv: RGB värden i en picturebox
Som jag skrev i mitt inlägg skulle jag själv använda API..... Det sätt som jag gjort det på är endast ett av hundra... Det vet du och det vet jag....
Han som frågade, efterfrågade endast ett sätt att kolla vilken färg en viss pixel har.. inget om optimering framgår....
Självklart vet jag att det är onödigt att anropa en funktion tre gånger istället för en gång....
Men ibland favoriserar jag lättläst kod framför snabb kod. Jag menar VB är inget språk att skriva spel och andra hypersnabba grafik-rutiner i..
Mina funktioner för att lösa problemet är:
* Estetiskt korrekt
* Objektorienterat
Men vem bryr sig.....
Återigen tack för dina synpunkter...
/peterhSv: RGB värden i en picturebox
Försöker frälsa världen genom att optimera kod...
Näää... Kanske inte riktigt...
Risken med att visa exempel som är långt från effektiv är att de sprider sig. Detta gäller ju även tvärt om.
Det är därför jag fäster stor vikt vid att alltid försöka göra ge en så optimal lösning som möjligt går inom rimlig krav. Vilket kommer förhoppningsvis leder till en bättrer värld.
Det blir lätt då att jag går fram som en ångvält och visar inte mycket till respekt för andra.Sv: RGB värden i en picturebox
/peterh
Men att optimera för en 486 kan jag förstå men för en PIII-800 Mhz
Men OK då.Sv: RGB värden i en picturebox
color = Picture1.Point(i, j)
red = CLng(color Mod 256)
green = CLng((color \ 256) Mod 256)
blue = CLng((color \ 65536) Mod 256)