break;
for (x=0; x < (ssize_t) roi->width; x++)
{
- *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
+ *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
p+=GetPixelChannels(image);
}
}
}
case IndexQuantum:
{
- *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
+ *q=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
break;
}
default:
break;
for (x=0; x < (ssize_t) roi->width; x++)
{
- *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
+ *q++=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
p+=GetPixelChannels(image);
}
}
}
case IndexQuantum:
{
- *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
+ *q=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
break;
}
default:
break;
for (x=0; x < (ssize_t) roi->width; x++)
{
- *q++=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
+ *q++=ScaleQuantumToLongLong(ClampToQuantum(GetPixelIntensity(image,p)));
p+=GetPixelChannels(image);
}
}
}
case IndexQuantum:
{
- *q=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
+ *q=ScaleQuantumToLongLong(ClampToQuantum(GetPixelIntensity(image,p)));
break;
}
default:
break;
for (x=0; x < (ssize_t) roi->width; x++)
{
- *q++=GetPixelIntensity(image,p);
+ *q++=ClampToQuantum(GetPixelIntensity(image,p));
p+=GetPixelChannels(image);
}
}
}
case IndexQuantum:
{
- *q=(GetPixelIntensity(image,p));
+ *q=ClampToQuantum(GetPixelIntensity(image,p));
break;
}
default:
break;
for (x=0; x < (ssize_t) roi->width; x++)
{
- *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
+ *q++=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
p+=GetPixelChannels(image);
}
}
}
case IndexQuantum:
{
- *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
+ *q=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
break;
}
default:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% GetPixelIntensity() returns a single sample intensity value from the red,
-% green, and blue components of a pixel.
+% green, and blue components of a pixel based on the selected method:
+%
+% Rec601Luma 0.298839R + 0.586811G + 0.114350B
+% Rec709Luma 0.21260R + 0.71520G + 0.07220B
+% Brightness max(R, G, B)
+% Lightness (min(R, G, B) + max(R, G, B)) / 2.0
+% RMS (R^2 + G^2 + B^2) / 3.0
+% Average (R + G + B) / 3.0
%
% The format of the GetPixelIntensity method is:
%
% o pixel: Specifies a pointer to a Quantum structure.
%
*/
+
+static inline MagickRealType MagickMax(const MagickRealType x,
+ const MagickRealType y)
+{
+ if (x > y)
+ return(x);
+ return(y);
+}
+
+static inline MagickRealType MagickMin(const MagickRealType x,
+ const MagickRealType y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
MagickExport MagickRealType GetPixelIntensity(const Image *restrict image,
const Quantum *restrict pixel)
{
MagickRealType
blue,
green,
- red;
+ red,
+ intensity;
if (image->colorspace == GRAYColorspace)
return((MagickRealType) pixel[image->channel_map[GrayPixelChannel].offset]);
- if (image->colorspace != sRGBColorspace)
- return(0.298839f*pixel[image->channel_map[RedPixelChannel].offset]+
- 0.586811f*pixel[image->channel_map[GreenPixelChannel].offset]+
- 0.114350f*pixel[image->channel_map[BluePixelChannel].offset]);
- red=DecodePixelGamma((MagickRealType)
- pixel[image->channel_map[RedPixelChannel].offset]);
- green=DecodePixelGamma((MagickRealType)
- pixel[image->channel_map[GreenPixelChannel].offset]);
- blue=DecodePixelGamma((MagickRealType)
- pixel[image->channel_map[BluePixelChannel].offset]);
- return(0.298839f*red+0.586811f*green+0.114350f*blue);
+ red=(MagickRealType) pixel[image->channel_map[RedPixelChannel].offset];
+ green=(MagickRealType) pixel[image->channel_map[GreenPixelChannel].offset];
+ blue=(MagickRealType) pixel[image->channel_map[BluePixelChannel].offset];
+ switch (image->intensity)
+ {
+ case Rec601LumaPixelIntensityMethod:
+ default:
+ {
+ if (image->colorspace == sRGBColorspace)
+ {
+ red=DecodePixelGamma(red);
+ green=DecodePixelGamma(green);
+ blue=DecodePixelGamma(blue);
+ }
+ intensity=0.298839f*red+0.586811f*green+0.114350f*blue;
+ break;
+ }
+ case Rec709LumaPixelIntensityMethod:
+ {
+ if (image->colorspace == sRGBColorspace)
+ {
+ red=DecodePixelGamma(red);
+ green=DecodePixelGamma(green);
+ blue=DecodePixelGamma(blue);
+ }
+ intensity=0.21260f*red+0.71520f*green+0.07220f*blue;
+ break;
+ }
+ case BrightnessPixelIntensityMethod:
+ {
+ if (image->colorspace == sRGBColorspace)
+ {
+ red=DecodePixelGamma(red);
+ green=DecodePixelGamma(green);
+ blue=DecodePixelGamma(blue);
+ }
+ intensity=MagickMax(MagickMax(red,green),blue);
+ break;
+ }
+ case LightnessPixelIntensityMethod:
+ {
+ if (image->colorspace == sRGBColorspace)
+ {
+ red=DecodePixelGamma(red);
+ green=DecodePixelGamma(green);
+ blue=DecodePixelGamma(blue);
+ }
+ intensity=MagickMin(MagickMin(red,green),blue);
+ break;
+ }
+ case RMSPixelIntensityMethod:
+ {
+ intensity=(MagickRealType) sqrt((double) red*red+green*green+blue*blue);
+ break;
+ }
+ case AveragePixelIntensityMethod:
+ {
+ intensity=(red+green+blue)/3.0;
+ break;
+ }
+ }
+ return(intensity);
}
\f
%
*/
-static inline double MagickMax(const double x,const double y)
-{
- if (x > y)
- return(x);
- return(y);
-}
-
static inline void CatromWeights(const double x,double (*weights)[4])
{
double
x_offset--;
y_offset--;
}
- p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
- exception);
+ p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,(size_t)
+ count,exception);
if (p == (const Quantum *) NULL)
{
status=MagickFalse;
x_offset--;
y_offset--;
}
- p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,count,count,
- exception);
+ p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,(size_t) count,(size_t)
+ count,exception);
if (p == (const Quantum *) NULL)
{
status=MagickFalse;
x_offset--;
y_offset--;
}
- p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
- exception);
+ p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,(size_t)
+ count,exception);
if (p == (const Quantum *) NULL)
{
status=MagickFalse;
/*
Transparencies are involved - set alpha distance
*/
- pixel=GetPixelAlpha(source,p)-(double)
- GetPixelAlpha(destination,q);
+ pixel=GetPixelAlpha(source,p)-(double) GetPixelAlpha(destination,q);
distance=pixel*pixel;
if (distance > fuzz)
return(MagickFalse);
"-fuzz distance colors within this distance are considered equal",
"-gravity type horizontal and vertical text placement",
"-green-primary point chromaticity green primary point",
- "-intensity method method to generate intensity value from pixel",
+ "-intensity method method to generate an intensity value from a pixel",
"-intent type type of rendering intent when managing the image color",
"-interlace type type of image interlacing scheme",
"-interline-spacing value",
ThrowConvertInvalidArgumentException(option,argv[i]);
break;
}
+ if (LocaleCompare("intensity",option+1) == 0)
+ {
+ ssize_t
+ intensity;
+
+ if (*option == '+')
+ break;
+ i++;
+ if (i == (ssize_t) (argc-1))
+ ThrowConvertException(OptionError,"MissingArgument",option);
+ intensity=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse,argv[i]);
+ if (intensity < 0)
+ ThrowConvertException(OptionError,"UnrecognizedPixelIntensityMethod",argv[i]);
+ break;
+ }
if (LocaleCompare("intent",option+1) == 0)
{
ssize_t
i++;
if (i == (ssize_t) (argc-1))
ThrowConvertException(OptionError,"MissingArgument",option);
- intent=ParseCommandOption(MagickIntentOptions,MagickFalse,
- argv[i]);
+ intent=ParseCommandOption(MagickIntentOptions,MagickFalse,argv[i]);
if (intent < 0)
- ThrowConvertException(OptionError,"UnrecognizedIntentType",
- argv[i]);
+ ThrowConvertException(OptionError,"UnrecognizedIntentType",argv[i]);
break;
}
if (LocaleCompare("interlace",option+1) == 0)
"-fuzz distance colors within this distance are considered equal",
"-gravity type horizontal and vertical text placement",
"-green-primary point chromaticity green primary point",
- "-intensity method method to generate intensity value from pixel",
+ "-intensity method method to generate an intensity value from a pixel",
"-intent type type of rendering intent when managing the image color",
"-interlace type type of image interlacing scheme",
"-interline-spacing value",
ThrowMogrifyInvalidArgumentException(option,argv[i]);
break;
}
+ if (LocaleCompare("intensity",option+1) == 0)
+ {
+ ssize_t
+ intensity;
+
+ if (*option == '+')
+ break;
+ i++;
+ if (i == (ssize_t) (argc-1))
+ ThrowMogrifyException(OptionError,"MissingArgument",option);
+ intensity=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse,argv[i]);
+ if (intensity < 0)
+ ThrowMogrifyException(OptionError,"UnrecognizedPixelIntensityMethod",
+ argv[i]);
+ break;
+ }
if (LocaleCompare("intent",option+1) == 0)
{
ssize_t
}
case 'i':
{
+ if (LocaleCompare("intensity",option+1) == 0)
+ {
+ if (*option == '+')
+ {
+ (void) SetImageOption(image_info,option+1,"undefined");
+ break;
+ }
+ (void) SetImageOption(image_info,option+1,argv[i+1]);
+ break;
+ }
if (LocaleCompare("intent",option+1) == 0)
{
if (*option == '+')