ipl.c revision acd2ed254c18c254a0ab5aafa06d1645e5d079d8
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 2ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 4ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 5ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 6ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% IIIIIIIIII PPPPPPPP LL % 7ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PP PP LL % 8ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PP PP LL % 9ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PP PP LL % 10ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PPPPPPPP LL % 11ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PP LL % 12ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% II PP LL % 13ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% IIIIIIIIII PP LLLLLLLL % 14ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 15ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 16ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 17ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% Read/Write Scanalytics IPLab Image Format % 18ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% Sean Burke % 19ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% 2008.05.07 % 20ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% v 0.9 % 21ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 22ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % 23ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% dedicated to making software imaging solutions freely available. % 24ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 25ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% You may not use this file except in compliance with the License. You may % 26ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% obtain a copy of the License at % 27ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 28ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% http://www.imagemagick.org/script/license.php % 29ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 30ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% Unless required by applicable law or agreed to in writing, software % 31ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% distributed under the License is distributed on an "AS IS" BASIS, % 32ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 33ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% See the License for the specific language governing permissions and % 34ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% limitations under the License. % 35ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% % 36ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% 38ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy% 39ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy*/ 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h" 454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h" 464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h" 474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h" 484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h" 49510d06a3f7063e91993e13d546d5685048248074cristy#include "MagickCore/colorspace-private.h" 504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h" 514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h" 524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h" 534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h" 544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h" 554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h" 564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h" 574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h" 584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h" 594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h" 604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h" 614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h" 624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h" 634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h" 644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h" 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristyTyedef declarations 683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 703ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _IPLInfo 713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 72eaedf06777741da32408da72c1e512975c600c48cristy unsigned int 73eaedf06777741da32408da72c1e512975c600c48cristy tag, 74eaedf06777741da32408da72c1e512975c600c48cristy size, 75eaedf06777741da32408da72c1e512975c600c48cristy time, 76eaedf06777741da32408da72c1e512975c600c48cristy z, 77eaedf06777741da32408da72c1e512975c600c48cristy width, 78eaedf06777741da32408da72c1e512975c600c48cristy height, 79eaedf06777741da32408da72c1e512975c600c48cristy colors, 80eaedf06777741da32408da72c1e512975c600c48cristy depth, 81eaedf06777741da32408da72c1e512975c600c48cristy byteType; 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} IPLInfo; 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 843ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 851e178e70fb3c956f9fc1e30c3ba863e882666465cristy WriteIPLImage(const ImageInfo *,Image *,ExceptionInfo *); 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid increase (void *pixel, int byteType){ 883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch(byteType){ 893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 0:(*((unsigned char *) pixel))++; break; 903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1:(*((signed int *) pixel))++; break; 913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 2:(*((unsigned int *) pixel))++; break; 923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 3:(*((signed long *) pixel))++; break; 933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default:(*((unsigned int *) pixel))++; break; 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % I s I P L % 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % IsIPL() returns MagickTrue if the image format type, identified by the 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % magick string, is IPL. 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % The format of the IsIPL method is: 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % MagickBooleanType IsIPL(const unsigned char *magick,const size_t length) 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % A description of each parameter follows: 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % o magick: compare image format pattern against these bytes. 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % o length: Specifies the length of the magick string. 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsIPL(const unsigned char *magick,const size_t length) 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 4) 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((const char *) magick,"data",4) == 0) 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % R e a d I P L I m a g e % 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % ReadIPLImage() reads a Scanalytics IPLab image file and returns it. It 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % allocates the memory necessary for the new Image structure and returns a 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % pointer to the new image. 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % According to the IPLab spec, the data is blocked out in five dimensions: 1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % { t, z, c, y, x }. When we return the image, the latter three are folded 1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % into the standard "Image" structure. The "scenes" (image_info->scene) 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % correspond to the order: { {t0,z0}, {t0, z1}, ..., {t1,z0}, {t1,z1}... } 1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % The number of scenes is t*z. 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % The format of the ReadIPLImage method is: 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception) 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % A description of each parameter follows: 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % o image_info: The image info. 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % o exception: return any errors or warnings in this structure. 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid SetHeaderFromIPL(Image *image, IPLInfo *ipl){ 165c5de69967ea7758f3204962a84c780c82d824ca7cristy image->columns = ipl->width; 166c5de69967ea7758f3204962a84c780c82d824ca7cristy image->rows = ipl->height; 167c5de69967ea7758f3204962a84c780c82d824ca7cristy image->depth = ipl->depth; 168c5de69967ea7758f3204962a84c780c82d824ca7cristy image->x_resolution = 1; 169c5de69967ea7758f3204962a84c780c82d824ca7cristy image->y_resolution = 1; 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception) 1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Declare variables 1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image *image; 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType status; 1824c08aed51c5899665ade97263692328eea4af106cristy register Quantum *q; 1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char magick[12], *pixels; 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t count; 185bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t y; 186bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t t_count=0; 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t length; 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IPLInfo 1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info; 1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumFormatType 1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format; 1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumType 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type; 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open Image 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( image_info->debug != MagickFalse) 2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent, GetMagickModule(), "%s", 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=AcquireImage(image_info); 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read IPL image 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine endianness 2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If we get back "iiii", we have LSB,"mmmm", MSB 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,4,magick); 225da16f16767eb31921af855f17bda465fffc4e000cristy (void) count; 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if((LocaleNCompare((char *) magick,"iiii",4) == 0)) 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->endian=LSBEndian; 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if((LocaleNCompare((char *) magick,"mmmm",4) == 0)) 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->endian=MSBEndian; 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, "ImproperImageHeader"); 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Skip o'er the next 8 bytes (garbage) */ 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image, 8, magick); 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Excellent, now we read the header unimpeded. 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,4,magick); 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if((LocaleNCompare((char *) magick,"data",4) != 0)) 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, "ImproperImageHeader"); 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.size=ReadBlobLong(image); 2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.width=ReadBlobLong(image); 2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.height=ReadBlobLong(image); 2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if((ipl_info.width == 0UL) || (ipl_info.height == 0UL)) 2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.colors=ReadBlobLong(image); 2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(ipl_info.colors == 3){ image->colorspace=RGBColorspace;} 2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else { image->colorspace = GRAYColorspace; } 2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.z=ReadBlobLong(image); 2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.time=ReadBlobLong(image); 2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType=ReadBlobLong(image); 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Initialize Quantum Info */ 2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (ipl_info.byteType) { 2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 0: 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=8; 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = UnsignedQuantumFormat; 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1: 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=16; 2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = SignedQuantumFormat; 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 2: 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=16; 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = UnsignedQuantumFormat; 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 3: 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=32; 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = SignedQuantumFormat; 2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 4: ipl_info.depth=32; 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = FloatingPointQuantumFormat; 2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 5: 2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=8; 2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = UnsignedQuantumFormat; 2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 6: 2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=16; 2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = UnsignedQuantumFormat; 2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 10: 2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=64; 2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = FloatingPointQuantumFormat; 2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.depth=16; 2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format = UnsignedQuantumFormat; 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set number of scenes of image 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetHeaderFromIPL(image, &ipl_info); 3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Thats all we need if we are pinging. */ 3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping != MagickFalse) 3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns; 3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=GetQuantumType(image,exception); 3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetHeaderFromIPL(image, &ipl_info); 3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) 3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene >= (image_info->scene+image_info->number_scenes-1)) 3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 319e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy printf("Length: %.20g, Memory size: %.20g\n", (double) length,(double) 320e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->depth); 3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=AcquireQuantumInfo(image_info,image); 3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info == (QuantumInfo *) NULL) 3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetQuantumFormat(image,quantum_info,quantum_format); 3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=GetQuantumPixels(quantum_info); 3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(image->columns != ipl_info.width){ 3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 331e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy printf("Columns not set correctly! Wanted: %.20g, got: %.20g\n", 332e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) ipl_info.width, (double) image->columns); 3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Covert IPL binary to pixel packets 3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(ipl_info.colors == 1){ 341bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) image->rows; y++){ 3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlob(image, length*image->depth/8, pixels); 3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 344acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 346c5de69967ea7758f3204962a84c780c82d824ca7cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GrayQuantum,pixels,exception); 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 350c5de69967ea7758f3204962a84c780c82d824ca7cristy } 3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) image->rows; y++){ 3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlob(image, length*image->depth/8, pixels); 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 356acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 358c5de69967ea7758f3204962a84c780c82d824ca7cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 359c5de69967ea7758f3204962a84c780c82d824ca7cristy RedQuantum,pixels,exception); 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 363bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) image->rows; y++){ 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlob(image, length*image->depth/8, pixels); 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 366acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 367ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy break; 368c5de69967ea7758f3204962a84c780c82d824ca7cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GreenQuantum,pixels,exception); 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 373bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) image->rows; y++){ 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlob(image, length*image->depth/8, pixels); 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 376acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 377ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy break; 378c5de69967ea7758f3204962a84c780c82d824ca7cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy BlueQuantum,pixels,exception); 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetQuantumImageType(image,quantum_type); 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy t_count++; 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info = DestroyQuantumInfo(quantum_info); 3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (EOFBlob(image) != MagickFalse) 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(t_count < ipl_info.z * ipl_info.time){ 3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Proceed to next image. 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info, image); 4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (t_count < ipl_info.z*ipl_info.time); 4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CloseBlob(image); 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % R e g i s t e r I P L I m a g e % 4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % RegisterIPLImage() add attributes for the Scanalytics IPL image format to the 4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % list of supported formats. 4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 432bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterIPLImage(void) 4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("IPL"); 4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadIPLImage; 4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteIPLImage; 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsIPL; 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickTrue; 4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("IPL Image Sequence"); 4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("IPL"); 4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->endian_support=MagickTrue; 4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % U n r e g i s t e r I P L I m a g e % 4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % % 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % UnregisterIPLImage() removes format registrations made by the 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % IPL module from the list of supported formats. 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % The format of the UnregisterIPLImage method is: 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % UnregisterIPLImage(void) 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterIPLImage(void) 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("IPL"); 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4741e178e70fb3c956f9fc1e30c3ba863e882666465cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4751e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4761e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4771e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4781e178e70fb3c956f9fc1e30c3ba863e882666465cristy% W r i t e I P L I m a g e % 4791e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4801e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4811e178e70fb3c956f9fc1e30c3ba863e882666465cristy% % 4821e178e70fb3c956f9fc1e30c3ba863e882666465cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4831e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4841e178e70fb3c956f9fc1e30c3ba863e882666465cristy% WriteIPLImage() writes an image to a file in Scanalytics IPLabimage format. 4851e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4861e178e70fb3c956f9fc1e30c3ba863e882666465cristy% The format of the WriteIPLImage method is: 4871e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4881e178e70fb3c956f9fc1e30c3ba863e882666465cristy% MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image) 4891e178e70fb3c956f9fc1e30c3ba863e882666465cristy% Image *image,ExceptionInfo *exception) 4901e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4911e178e70fb3c956f9fc1e30c3ba863e882666465cristy% A description of each parameter follows. 4921e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4931e178e70fb3c956f9fc1e30c3ba863e882666465cristy% o image_info: The image info. 4941e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4951e178e70fb3c956f9fc1e30c3ba863e882666465cristy% o image: The image. 4961e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4971e178e70fb3c956f9fc1e30c3ba863e882666465cristy% o exception: return any errors or warnings in this structure. 4981e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 4991e178e70fb3c956f9fc1e30c3ba863e882666465cristy*/ 5001e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image, 5011e178e70fb3c956f9fc1e30c3ba863e882666465cristy ExceptionInfo *exception) 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 503ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy IPLInfo 504ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy ipl_info; 505ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5124c08aed51c5899665ade97263692328eea4af106cristy register const Quantum 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 518ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy ssize_t 519ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy y; 520ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy 521ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy unsigned char 522ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy *pixels; 523ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open output image file. 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 5333a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy assert(exception != (ExceptionInfo *) NULL); 5343a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy assert(exception->signature == MagickSignature); 5351e178e70fb3c956f9fc1e30c3ba863e882666465cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=AcquireQuantumInfo(image_info, image); 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((quantum_info->format == UndefinedQuantumFormat) && 5431e178e70fb3c956f9fc1e30c3ba863e882666465cristy (IsHighDynamicRangeImage(image,exception) != MagickFalse)) 5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); 5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch(quantum_info->depth){ 5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 0; 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(quantum_info->format == SignedQuantumFormat){ 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 2; 5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 1; 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(quantum_info->format == FloatingPointQuantumFormat){ 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 3; 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 4; 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 64: 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 10; 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.byteType = 2; 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5730b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy ipl_info.z = (unsigned int) GetImageListLength(image); 5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* There is no current method for detecting whether we have T or Z stacks */ 5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ipl_info.time = 1; 5760b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy ipl_info.width = (unsigned int) image->columns; 5770b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy ipl_info.height = (unsigned int) image->rows; 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 579510d06a3f7063e91993e13d546d5685048248074cristy if (IsRGBColorspace(image->colorspace) == MagickFalse) 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) TransformImageColorspace(image,RGBColorspace); 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 582510d06a3f7063e91993e13d546d5685048248074cristy if(IsRGBColorspace(image->colorspace) == MagickTrue) { ipl_info.colors = 3; } 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ ipl_info.colors = 1; } 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5850b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy ipl_info.size = (unsigned int) (28 + 5860b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy ((image->depth)/8)*ipl_info.height*ipl_info.width*ipl_info.colors*ipl_info.z); 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Ok! Calculations are done. Lets write this puppy down! */ 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write IPL header. 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Shockingly (maybe not if you have used IPLab), IPLab itself CANNOT read MSBEndian 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy files! The reader above can, but they cannot. For compatability reasons, I will leave 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the code in here, but it is all but useless if you want to use IPLab. */ 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(image_info->endian == MSBEndian) 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, 4, (const unsigned char *) "mmmm"); 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else{ 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->endian = LSBEndian; 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, 4, (const unsigned char *) "iiii"); 6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, 4); 6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, 4, (const unsigned char *) "100f"); 6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, 4, (const unsigned char *) "data"); 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.size); 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.width); 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.height); 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.colors); 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(image_info->adjoin == MagickFalse) 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, 1); 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.z); 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.time); 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, ipl_info.byteType); 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert MIFF to IPL raster pixels. 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=GetQuantumPixels(quantum_info); 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(ipl_info.colors == 1){ 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Red frame */ 625bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) ipl_info.height; y++){ 6264c08aed51c5899665ade97263692328eea4af106cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 6274c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6294c08aed51c5899665ade97263692328eea4af106cristy (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info, 6301e178e70fb3c956f9fc1e30c3ba863e882666465cristy GrayQuantum, pixels,exception); 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, image->columns*image->depth/8, pixels); 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(ipl_info.colors == 3){ 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Red frame */ 637bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) ipl_info.height; y++){ 6384c08aed51c5899665ade97263692328eea4af106cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 6394c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6414c08aed51c5899665ade97263692328eea4af106cristy (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info, 6421e178e70fb3c956f9fc1e30c3ba863e882666465cristy RedQuantum, pixels,exception); 6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, image->columns*image->depth/8, pixels); 6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Green frame */ 647bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) ipl_info.height; y++){ 6481e178e70fb3c956f9fc1e30c3ba863e882666465cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 6494c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6514c08aed51c5899665ade97263692328eea4af106cristy (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info, 6521e178e70fb3c956f9fc1e30c3ba863e882666465cristy GreenQuantum, pixels,exception); 6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, image->columns*image->depth/8, pixels); 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Blue frame */ 656bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for(y = 0; y < (ssize_t) ipl_info.height; y++){ 6571e178e70fb3c956f9fc1e30c3ba863e882666465cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 6584c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6604c08aed51c5899665ade97263692328eea4af106cristy (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info, 6611e178e70fb3c956f9fc1e30c3ba863e882666465cristy BlueQuantum, pixels,exception); 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, image->columns*image->depth/8, pixels); 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 665cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, 666cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy image->rows); 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=DestroyQuantumInfo(quantum_info); 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,SaveImagesTag,scene++, 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(image)); 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }while (image_info->adjoin != MagickFalse); 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image, 4, (const unsigned char *) "fini"); 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLong(image, 0); 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristyCloseBlob(image); 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristyreturn(MagickTrue); 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 688