Visual Basic (Declaration) | |
---|---|
Public Class RemapHueCommand Inherits Leadtools.ImageProcessing.RasterCommand Implements IRasterCommand |
Visual Basic (Usage) | Copy Code |
---|---|
Dim instance As RemapHueCommand |
C# | |
---|---|
public class RemapHueCommand : Leadtools.ImageProcessing.RasterCommand, IRasterCommand |
C++/CLI | |
---|---|
public ref class RemapHueCommand : public Leadtools.ImageProcessing.RasterCommand, IRasterCommand |
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() Dim codecs As New RasterCodecs() codecs.ThrowExceptionsOnInvalidImages = True Dim leadImage As RasterImage = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "Master.jpg")) ' Prepare the command 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 'Allocate tables ReDim MaskTable(Length - 1) ReDim HueTable(Length - 1) 'Initialize tables For i = 0 To Length - 1 MaskTable(i) = 0 HueTable(i) = i Next '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 = 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 'Set values in HueTable, MaskTable HueTable(HueGreen) = HueTable(HueGreen) + HueChange MaskTable(HueGreen) = 1 'set the hues near green (+/- 15) 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, Path.Combine(LEAD_VARS.ImagesDir, "Result.jpg"), RasterImageFormat.Jpeg, 24) End Sub Public NotInheritable Class LEAD_VARS Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images" End Class |
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 codecs = new RasterCodecs(); codecs.ThrowExceptionsOnInvalidImages = true; RasterImage image = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "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, Path.Combine(LEAD_VARS.ImagesDir, "Result.jpg"), RasterImageFormat.Jpeg, 24); } static class LEAD_VARS { public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images"; } |
SilverlightCSharp | 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(RasterImage image, Stream outStream) { // 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 = hsvRef.H - HueGreen; HueChange = (Change>0) ? Change : (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((int)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); // Save result image RasterCodecs codecs = new RasterCodecs(); codecs.Save(image, outStream, RasterImageFormat.Jpeg, 24); image.Dispose(); } |
SilverlightVB | 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(ByVal image As RasterImage, ByVal outStream As Stream) ' Prepare the command Dim MaskTable As Integer() Dim HueTable As Integer() Dim hsvRef As RasterHsvColor Dim HueGreen, HueChange As Integer Dim Change As Integer Dim i, Count As Integer Dim Length As Integer If image.BitsPerPixel >= 48 Then Length = &H10000 Else If Not(image.BitsPerPixel = 16 OrElse image.BitsPerPixel = 12) Then Length = 256 Else If Not image.GetLookupTable() Is Nothing AndAlso image.UseLookupTable Then Length = 256 Else Length = (1 << image.BitsPerPixel) End If 'Allocate tables MaskTable = New Integer(Length - 1){} HueTable = New Integer(Length - 1){} 'Initialize tables i = 0 Do While i < Length MaskTable(i) = 0 HueTable(i) = i i += 1 Loop '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 = hsvRef.H - HueGreen If (Change>0) Then HueChange = Change Else HueChange = (Change + Length - 1) End If 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 i = INCREMENT_S1(HueGreen, Length) Do While Count > 0 HueTable(i) = ADD_S1(CInt(HueTable(i)), HueChange, Length) MaskTable(i) = 1 i = INCREMENT_S1(i, Length) Count -= 1 Loop Count = (15 * (Length - 1))/255 i = DECREMENT_S1(HueGreen, Length) Do While Count > 0 HueTable(i) = ADD_S1(HueTable(i), HueChange, Length) MaskTable(i) = 1 i = DECREMENT_S1(i, Length) Count -= 1 Loop Dim command As RemapHueCommand = New RemapHueCommand(MaskTable, HueTable, Nothing, Nothing, Length) command.Run(image) ' Save result image Dim codecs As RasterCodecs = New RasterCodecs() codecs.Save(image, outStream, RasterImageFormat.Jpeg, 24) image.Dispose() End Sub |
- This command can be used to change a range of colors to another range of colors. For example, it could be used to change all red pixels to any color, where a red pixel can have any brightness (V) and any amount of white (saturation). A red pixel in this case would be RGB(x,y,y) where 0 <= x <(LookUpTableLength - 1) and 0 <= y < x or in the HSV color space HSV(0,x,x) where 0<=x<=(LookUpTableLength - 1)
- The Mask lookup table identifies which values in the HueTable are valid. If a Mask value is 0, then the corresponding value in the HueTable is ignored. If a Mask value is non-zero, then the corresponding value in the HueTable is used. For example, if a pixel has a hue value of 240 and Mask[240] is nonzero, then the hue value of 240 is replaced with HueTable[240]. Traditionally, hue ranges from 0 to 359. For the lookup table, the range of 0 to 359 is remapped to a range of 0.. LookUpTableLength - 1. For example, if LookUpTableLength = 256
- This command supports 48 and 64-bit colored images.
- This command does not support signed data images.
- This command does not support 32-bit grayscale images.
System.Object
Leadtools.ImageProcessing.RasterCommand
Leadtools.ImageProcessing.Color.RemapHueCommand
Target Platforms: Silverlight, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7, MAC OS/X (Intel Only)
Reference
RemapHueCommand MembersLeadtools.ImageProcessing.Color Namespace
Changing Brightness and Contrast
ChangeIntensityCommand Class
GammaCorrectCommand Class
ChangeContrastCommand Class
HistogramContrastCommand Class
StretchIntensityCommand Class
InvertCommand Class
ChangeHueCommand Class
ChangeSaturationCommand Class
HistogramEqualizeCommand Class
Leadtools.ImageProcessing.FillCommand
HistogramCommand Class
Leadtools.ImageProcessing.Core.WindowLevelCommand