Re: rgb zu hsv und zurück beschleunigen?
Verfasst: 29.02.2012 17:20
Hm hm hm. Okey bevor ich mich da nu wieder durchwusel, einfache frage: Kann ich damit folgendes resultat erziehlen?


Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Hervoragende Idee. Das kann man dann auch direkt im RGB-System machen. Ich ess jetzt erstmal was und dann bastel ich das mal. Stargates Variante mittels DirectX sollte aber dennoch um einiges schneller sein.NicTheQuick hat geschrieben:Man könnte aber doch ein graues Auto als Textur nehmen und das dann in jede beliebige Farbe transformieren, oder?
Code: Alles auswählen
Global H.d,S.d,V.d
Structure Pixel
Pixel.l
EndStructure
Structure Pixel_BGRA
Blue.a
Green.a
Red.a
Alpha.a
EndStructure
Procedure RGB_To_HSV(ColorRed.d,ColorGreen.d,ColorBlue.d)
MinColor.d
MaxColor.d
ColorRed / 255
ColorGreen / 255
ColorBlue / 255
If ColorRed < ColorGreen
MinColor = ColorRed
Else
MinColor = ColorGreen
EndIf
If MinColor > ColorBlue
MinColor = ColorBlue
EndIf
If ColorRed > ColorGreen
MaxColor = ColorRed
Else
MaxColor = ColorGreen
EndIf
If MaxColor < ColorBlue
MaxColor = ColorBlue
EndIf
If MaxColor = MinColor
H = 0
ElseIf MaxColor = ColorRed
H = 60 * ((ColorGreen-ColorBlue)/(MaxColor-MinColor))
ElseIf MaxColor = ColorGreen
H = 60 * (2+((ColorBlue-ColorRed)/(MaxColor-MinColor)))
ElseIf MaxColor = ColorBlue
H = 60 * (4+((ColorRed-ColorGreen)/(MaxColor-MinColor)))
EndIf
If MaxColor = 0
S = 0
H = 0
Else
S = (MaxColor-MinColor)/MaxColor
EndIf
V = MaxColor
EndProcedure
Procedure.l HSV_To_RGB()
ColorRed.d
ColorGreen.d
ColorBlue.d
If S = 0
ColorRed = V
ColorGreen = V
ColorBlue = V
Else
hi.d = H/60
l = Round(hi, #PB_Round_Down)
f.d = hi-l
p.d = V * (1-S)
q.d = V * (1-S*f)
t.d = V * (1-S*(1-f))
If l = 1
ColorRed = q
ColorGreen = V
ColorBlue = p
ElseIf l = 2
ColorRed = p
ColorGreen = V
ColorBlue = t
ElseIf l = 3
ColorRed = p
ColorGreen = q
ColorBlue = V
ElseIf l = 4
ColorRed = t
ColorGreen = p
ColorBlue = V
ElseIf l = 5
ColorRed = V
ColorGreen = p
ColorBlue = q
Else
ColorRed = V
ColorGreen = t
ColorBlue = p
EndIf
EndIf
ProcedureReturn RGB(Colorblue * 255,ColorGreen * 255,Colorred * 255)
EndProcedure
Procedure.i ColorizeGreyscale(Image.i, *Color.Pixel_BGRA)
Protected Width.i
Protected Height.i
Protected SrcBuffer.i
Protected *SrcPixel.Pixel_BGRA
Protected SrcPitch.i
Protected DstBuffer.i
Protected *DstPixel.Pixel_BGRA
Protected DstPitch.i
Protected Sprite.i
Protected x.i
Protected y.i
StartTime = timeGetTime_()
Width = ImageWidth(Image)
Height = ImageHeight(Image)
StartDrawing(ImageOutput(Image))
SrcBuffer = DrawingBuffer()
SrcPitch = DrawingBufferPitch()
StopDrawing()
Sprite = CreateSprite(#PB_Any, Width, Height, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(Sprite))
DstBuffer = DrawingBuffer()
DstPitch = DrawingBufferPitch()
*SrcPixel = SrcBuffer + Height * SrcPitch
*DstPixel = DstBuffer
For y = 1 To Height
For x = 1 To Width
*DstPixel\Blue = (*SrcPixel\Blue * *Color\Blue) / 255
*DstPixel\Green = (*SrcPixel\Green * *Color\Green) / 255
*DstPixel\Red = (*SrcPixel\Red * *Color\Red) / 255
*SrcPixel + 3
*DstPixel + 4
Next
*SrcPixel = SrcBuffer + (Height - y) * SrcPitch
*DstPixel = DstBuffer + y * DstPitch
Next
StopDrawing()
MessageRequester("ColorizeGreyscale", Str(timeGetTime_()-StartTime))
ProcedureReturn Sprite
EndProcedure
Procedure ChangeColor(Grad)
If IsImage(1) = 0
Global MaxHeight,MaxWidth
LoadImage(1,"b:\test.bmp")
;LoadImage(3,"media\TailLight.png")
MaxHeight = ImageHeight(1)
MaxWidth = ImageWidth(1)
CreateSprite(2,MaxWidth,MaxHeight)
StartTime = timeGetTime_()
Global Dim Color(MaxWidth,MaxHeight)
MaxHeight-1
MaxWidth-1
StartDrawing(ImageOutput(1))
For i = 0 To MaxHeight
For j = 0 To MaxWidth
Color(j, i) = Point(j, i)
Next j
Next
StopDrawing()
EndIf
i = 0
j = 0
StartDrawing(SpriteOutput(2))
Buffer = DrawingBuffer() ; Get the start address of the screen buffer
Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
For i = 0 To MaxHeight
For j = 0 To MaxWidth
RGB_To_HSV(Red(Color(j,i)),Green(Color(j,i)),Blue(Color(j,i)))
H + Grad
If H < 0
H + 360
ElseIf H > 360
H - 360
EndIf
*Line.Pixel = Buffer+(Pitch*i)+(j*4)
*Line\Pixel = HSV_To_RGB()
Next j
Next
;DrawAlphaImage(ImageID(3), 0, 0)
StopDrawing()
;SaveSprite(2,"media\NewTexture.bmp",#PB_ImagePlugin_BMP)
MessageRequester("ChangeColor",Str(timeGetTime_()-StartTime))
EndProcedure
timeBeginPeriod_(1)
InitSprite()
OpenScreen(1024, 768, 32, "Test")
ChangeColor(10)
LoadImage(0, "b:\testgreyscale.bmp")
Color.l = RGB($68, $EE, $BC)
Sprite.i = ColorizeGreyscale(0, @Color)
SaveSprite(Sprite, "b:\testoutput.bmp")
timeEndPeriod_(1)