Uses a lookup table to change an image's hue values. The saturation and value tables change S and V values only if a particular hue value is marked as non-zero in the Mask property. It is used for all resolutions, including 48 and 64-bit images.
Syntax
Example
Run the RemapHueCommand on an image and change all green hues (and hues near green).
Visual Basic | Copy Code |
---|
Public Function INCREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
Return ((x + 1) Mod Length)
End Function
Public Function DECREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
Return ((x + (Length - 1)) Mod Length)
End Function
Public Function ADD_S1(ByVal x As Integer, ByVal y As Integer, ByVal Length As Integer) As Integer
Return ((x + y) Mod Length)
End Function
Public Sub RemapHueCommandCommandExample()
RasterCodecs.Startup()
Dim codecs As New RasterCodecs()
codecs.ThrowExceptionsOnInvalidImages = True
Dim leadImage As RasterImage = codecs.Load(LeadtoolsExamples.Common.ImagesPath.Path + "Master.jpg")
Dim MaskTable() As Integer
Dim HueTable() As Integer
Dim hsvRef As RasterHsvColor
Dim HueGreen As Integer
Dim HueChange As Integer
Dim Change As Integer
Dim i As Integer
Dim Count As Integer
Dim Length As Integer
If (leadImage.BitsPerPixel >= 48) Then
Length = 65536
ElseIf (Not (leadImage.BitsPerPixel = 16 Or leadImage.BitsPerPixel = 12)) Then
Length = 256
ElseIf (IsNothing(leadImage.GetLookupTable) And leadImage.UseLookupTable) Then
Length = 256
Else
Length = (1 << leadImage.BitsPerPixel)
End If
ReDim MaskTable(Length - 1)
ReDim HueTable(Length - 1)
For i = 0 To Length - 1
MaskTable(i) = 0
HueTable(i) = i
Next
hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(0, 255, 0))
HueGreen = hsvRef.H
hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(255, 128, 0))
Change = hsvRef.H - HueGreen
If (Change > 0) Then
HueChange = Change
Else
HueChange = Change + Length - 1
End If
HueGreen = (HueGreen * (Length - 1)) \ 255
HueChange = (HueChange * (Length - 1)) \ 255
HueTable(HueGreen) = HueTable(HueGreen) + HueChange
MaskTable(HueGreen) = 1
i = INCREMENT_S1(HueGreen, Length)
For Count = (15 * (Length - 1)) \ 255 To 1 Step -1
i = INCREMENT_S1(i, Length)
HueTable(i) = ADD_S1(HueTable(i), HueChange, Length)
MaskTable(i) = 1
Next
i = DECREMENT_S1(HueGreen, Length)
For Count = (15 * (Length - 1)) \ 255 To 1 Step -1
i = DECREMENT_S1(i, Length)
HueTable(i) = ADD_S1(HueTable(i), HueChange, Length)
MaskTable(i) = 1
Next
Dim command As RemapHueCommand = New RemapHueCommand(MaskTable, HueTable, Nothing, Nothing, Length)
command.Run(leadImage)
codecs.Save(leadImage, LeadtoolsExamples.Common.ImagesPath.Path + "Result.jpg", RasterImageFormat.Jpeg, 24)
RasterCodecs.Shutdown()
End Sub |
C# | Copy Code |
---|
public int INCREMENT_S1(int x, int Length) { return ((x + 1) % Length); } public int DECREMENT_S1(int x, int Length) { return ((x + (Length - 1)) % Length); } public int ADD_S1(int x, int y, int Length) { return ((x + y) % Length); } public void RemapHueCommandCommandExample() { // Load an image RasterCodecs.Startup(); RasterCodecs codecs = new RasterCodecs(); codecs.ThrowExceptionsOnInvalidImages = true; RasterImage image = codecs.Load(LeadtoolsExamples.Common.ImagesPath.Path + "Master.jpg"); // Prepare the command int[] MaskTable; int[] HueTable; RasterHsvColor hsvRef; int HueGreen, HueChange; int Change; int i, Count; int Length; if(image.BitsPerPixel >= 48) Length = 0x10000; else if(!(image.BitsPerPixel == 16 || image.BitsPerPixel == 12)) Length = 256; else if(image.GetLookupTable() != null && image.UseLookupTable) Length = 256; else Length = (1 << image.BitsPerPixel); //Allocate tables MaskTable = new int[Length]; HueTable = new int[Length]; //Initialize tables for (i = 0; i < Length; i++) { MaskTable[i] = 0; HueTable[i] = i; } //Get the hue for green hsvRef = RasterHsvColor.FromRasterColor(new RasterColor(0,255,0)); HueGreen = hsvRef.H; //Obtain new hue hsvRef = RasterHsvColor.FromRasterColor(new RasterColor(255, 128, 0)); Change = (int)hsvRef.H - (int)HueGreen; HueChange = (Change>0) ? (int)Change : (int)(Change + Length - 1); HueGreen *= (Length - 1)/255; HueChange *= (Length - 1)/255; //Set values in HueTable, MaskTable HueTable[HueGreen] = (HueTable[HueGreen] + HueChange); MaskTable[HueGreen] = 1; //set the hues near green (+/- 15) Count = (15 * (Length - 1))/255; for (i = INCREMENT_S1(HueGreen, Length); Count > 0; i = INCREMENT_S1(i, Length), Count--) { HueTable[i] = ADD_S1(HueTable[i], HueChange, Length); MaskTable[i] = 1; } Count = (15 * (Length - 1))/255; for (i = DECREMENT_S1(HueGreen, Length); Count > 0; i = DECREMENT_S1(i, Length), Count--) { HueTable[i] = ADD_S1(HueTable[i], HueChange, Length); MaskTable[i] = 1; } RemapHueCommand command = new RemapHueCommand(MaskTable, HueTable, null, null, Length); command.Run(image); codecs.Save(image, LeadtoolsExamples.Common.ImagesPath.Path + "Result.jpg", RasterImageFormat.Jpeg, 24); RasterCodecs.Shutdown(); } |
Remarks
Inheritance Hierarchy
Requirements
Target Platforms: Microsoft .NET Framework 2.0, Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family
See Also