% Write A Steganographic Image. %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% July 1992 %
% %
% %
-% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization %
% dedicated to making software imaging solutions freely available. %
% %
% You may not use this file except in compliance with the License. You may %
% obtain a copy of the License at %
% %
-% http://www.imagemagick.org/script/license.php %
+% https://www.imagemagick.org/script/license.php %
% %
% Unless required by applicable law or agreed to in writing, software %
% distributed under the License is distributed on an "AS IS" BASIS, %
/*
Include declarations.
*/
-#include "magick/studio.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/cache.h"
-#include "magick/colormap.h"
-#include "magick/constitute.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/image.h"
-#include "magick/image-private.h"
-#include "magick/list.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/monitor.h"
-#include "magick/monitor-private.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/string_.h"
-#include "magick/module.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/colormap.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/image.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/list.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/monitor.h"
+#include "MagickCore/monitor-private.h"
+#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/static.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
\f
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% o exception: return any errors or warnings in this structure.
%
*/
-
-static inline size_t MagickMin(const size_t x,
- const size_t y)
-{
- if (x < y)
- return(x);
- return(y);
-}
-
static Image *ReadSTEGANOImage(const ImageInfo *image_info,
ExceptionInfo *exception)
{
-#define GetBit(alpha,i) MagickMin((((size_t) (alpha) >> (size_t) \
- (i)) & 0x01),16)
-#define SetBit(alpha,i,set) (alpha)=(IndexPacket) ((set) != 0 ? \
- (size_t) (alpha) | (one << (size_t) (i)) : (size_t) \
- (alpha) & ~(one << (size_t) (i)))
+#define GetBit(alpha,i) (((size_t) (alpha) >> (size_t) (i)) & 0x01)
+#define SetBit(i,set) SetPixelIndex(image,(Quantum) ((set) != 0 ? \
+ (size_t) GetPixelIndex(image,q) | (one << (size_t) (i)) : \
+ (size_t) GetPixelIndex(image,q) & ~(one << (size_t) (i))),q)
Image
*image,
MagickBooleanType
status;
- PixelPacket
+ PixelInfo
pixel;
- register IndexPacket
- *indexes;
-
- register PixelPacket
+ register Quantum
*q;
register ssize_t
Initialize Image structure.
*/
assert(image_info != (const ImageInfo *) NULL);
- assert(image_info->signature == MagickSignature);
+ assert(image_info->signature == MagickCoreSignature);
if (image_info->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
image_info->filename);
assert(exception != (ExceptionInfo *) NULL);
- assert(exception->signature == MagickSignature);
+ assert(exception->signature == MagickCoreSignature);
one=1;
- image=AcquireImage(image_info);
+ image=AcquireImage(image_info,exception);
if ((image->columns == 0) || (image->rows == 0))
ThrowReaderException(OptionError,"MustSpecifyImageSize");
read_info=CloneImageInfo(image_info);
if (watermark == (Image *) NULL)
return((Image *) NULL);
watermark->depth=MAGICKCORE_QUANTUM_DEPTH;
- if (AcquireImageColormap(image,MaxColormapSize) == MagickFalse)
+ if (AcquireImageColormap(image,MaxColormapSize,exception) == MagickFalse)
ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
if (image_info->ping != MagickFalse)
{
(void) CloseBlob(image);
return(GetFirstImageInList(image));
}
+ status=SetImageExtent(image,image->columns,image->rows,exception);
+ if (status == MagickFalse)
+ return(DestroyImageList(image));
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+ if (q == (Quantum *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ SetPixelIndex(image,0,q);
+ q+=GetPixelChannels(image);
+ }
+ if (SyncAuthenticPixels(image,exception) == MagickFalse)
+ break;
+ }
/*
Get hidden watermark from low-order bits of image.
*/
{
if ((k/(ssize_t) watermark->columns) >= (ssize_t) watermark->rows)
break;
- (void) GetOneVirtualPixel(watermark,k % (ssize_t) watermark->columns,
- k/(ssize_t) watermark->columns,&pixel,exception);
+ (void) GetOneVirtualPixelInfo(watermark,UndefinedVirtualPixelMethod,
+ k % (ssize_t) watermark->columns,k/(ssize_t) watermark->columns,
+ &pixel,exception);
q=GetAuthenticPixels(image,x,y,1,1,exception);
- if (q == (PixelPacket *) NULL)
+ if (q == (Quantum *) NULL)
break;
- indexes=GetAuthenticIndexQueue(image);
switch (c)
{
case 0:
{
- SetBit(*indexes,i,GetBit(pixel.red,j));
+ SetBit(i,GetBit(pixel.red,j));
break;
}
case 1:
{
- SetBit(*indexes,i,GetBit(pixel.green,j));
+ SetBit(i,GetBit(pixel.green,j));
break;
}
case 2:
{
- SetBit(*indexes,i,GetBit(pixel.blue,j));
+ SetBit(i,GetBit(pixel.blue,j));
break;
}
}
break;
}
watermark=DestroyImage(watermark);
- (void) SyncImage(image);
+ (void) SyncImage(image,exception);
return(GetFirstImageInList(image));
}
\f
MagickInfo
*entry;
- entry=SetMagickInfo("STEGANO");
+ entry=AcquireMagickInfo("STEGANO","STEGANO","Steganographic image");
entry->decoder=(DecodeImageHandler *) ReadSTEGANOImage;
entry->format_type=ImplicitFormatType;
- entry->description=ConstantString("Steganographic image");
- entry->module=ConstantString("STEGANO");
(void) RegisterMagickInfo(entry);
return(MagickImageCoderSignature);
}