diff --git a/coders/hdr.c b/coders/hdr.c
index 09d3406..7b7d2a7 100644
--- a/coders/hdr.c
+++ b/coders/hdr.c
@@ -61,6 +61,12 @@
#include "magick/module.h"
/*
+ Forward declarations.
+*/
+static MagickBooleanType
+ WriteHDRImage(const ImageInfo *,Image *);
+
+/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
@@ -93,6 +99,8 @@
return(MagickFalse);
if (LocaleNCompare((const char *) magick,"#?RADIANCE",10) == 0)
return(MagickTrue);
+ if (LocaleNCompare((const char *) magick,"#?RGBE",6) == 0)
+ return(MagickTrue);
return(MagickFalse);
}
@@ -437,6 +445,7 @@
entry=SetMagickInfo("HDR");
entry->decoder=(DecodeImageHandler *) ReadHDRImage;
+ entry->encoder=(EncodeImageHandler *) WriteHDRImage;
entry->description=ConstantString("Radiance RGBE image format");
entry->module=ConstantString("HDR");
entry->magick=(IsImageFormatHandler *) IsHDR;
@@ -467,3 +476,106 @@
{
(void) UnregisterMagickInfo("HDR");
}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% W r i t e H D R I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% WriteHDRImage() writes an image in the Radience RGBE image format.
+%
+% The format of the WriteHDRImage method is:
+%
+% MagickBooleanType WriteHDRImage(const ImageInfo *image_info,
+% Image *image)
+%
+% A description of each parameter follows.
+%
+% o image_info: the image info.
+%
+% o image: The image.
+%
+*/
+static MagickBooleanType WriteHDRImage(const ImageInfo *image_info,Image *image)
+{
+ char
+ header[MaxTextExtent];
+
+ int
+ y;
+
+ MagickBooleanType
+ status;
+
+ QuantumInfo
+ *quantum_info;
+
+ register const PixelPacket
+ *p;
+
+ ssize_t
+ count;
+
+ size_t
+ length;
+
+ unsigned char
+ *pixels;
+
+ /*
+ Open output image file.
+ */
+ assert(image_info != (const ImageInfo *) NULL);
+ assert(image_info->signature == MagickSignature);
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+ if (status == MagickFalse)
+ return(status);
+ if (image->colorspace != RGBColorspace)
+ (void) TransformImageColorspace(image,RGBColorspace);
+ /*
+ Write header.
+ */
+ (void) ResetMagickMemory(header,' ',MaxTextExtent);
+ (void) FormatMagickString(header,MaxTextExtent,
+ "LBLSIZE=%.20g FORMAT='BYTE' TYPE='IMAGE' BUFSIZE=20000 DIM=2 EOL=0 "
+ "RECSIZE=%.20g ORG='BSQ' NL=%.20g NS=%.20g NB=1 N1=0 N2=0 N3=0 N4=0 NBB=0 "
+ "NLB=0 TASK='ImageMagick'",(double) MaxTextExtent,(double) image->columns,
+ (double) image->rows,(double) image->columns);
+ (void) WriteBlob(image,MaxTextExtent,(unsigned char *) header);
+ /*
+ Write HDR pixels.
+ */
+ image->depth=8;
+ quantum_info=AcquireQuantumInfo(image_info,image);
+ if (quantum_info == (QuantumInfo *) NULL)
+ ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
+ pixels=GetQuantumPixels(quantum_info);
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
+ GrayQuantum,pixels,&image->exception);
+ count=WriteBlob(image,length,pixels);
+ if (count != (ssize_t) length)
+ break;
+ status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+ image->rows);
+ if (status == MagickFalse)
+ break;
+ }
+ quantum_info=DestroyQuantumInfo(quantum_info);
+ (void) CloseBlob(image);
+ return(MagickTrue);
+}
diff --git a/coders/vicar.c b/coders/vicar.c
index 5e1b11d..4431b2c 100644
--- a/coders/vicar.c
+++ b/coders/vicar.c
@@ -485,7 +485,7 @@
if (count != (ssize_t) length)
break;
status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
- image->rows);
+ image->rows);
if (status == MagickFalse)
break;
}
diff --git a/magick/magic.c b/magick/magic.c
index 859d656..4a759ff 100644
--- a/magick/magic.c
+++ b/magick/magic.c
@@ -121,7 +121,7 @@
{ "GPLT", 0, MagickString("#!/usr/local/bin/gnuplot") },
{ "HDF", 1, MagickString("HDF") },
{ "HDR", 0, MagickString("#?RADIANCE") },
- { "HDR", 0, MagickString("VIEW= ") },
+ { "HDR", 0, MagickString("#?RGBE") },
{ "HPGL", 0, MagickString("IN;") },
{ "HTML", 1, MagickString("HTML") },
{ "HTML", 1, MagickString("html") },