2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Read/Write RAW CMYK Image Format %
20 % Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % https://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/cache.h"
46 #include "MagickCore/channel.h"
47 #include "MagickCore/colorspace.h"
48 #include "MagickCore/constitute.h"
49 #include "MagickCore/exception.h"
50 #include "MagickCore/exception-private.h"
51 #include "MagickCore/image.h"
52 #include "MagickCore/image-private.h"
53 #include "MagickCore/list.h"
54 #include "MagickCore/magick.h"
55 #include "MagickCore/memory_.h"
56 #include "MagickCore/monitor.h"
57 #include "MagickCore/monitor-private.h"
58 #include "MagickCore/pixel-accessor.h"
59 #include "MagickCore/quantum-private.h"
60 #include "MagickCore/static.h"
61 #include "MagickCore/statistic.h"
62 #include "MagickCore/string_.h"
63 #include "MagickCore/module.h"
64 #include "MagickCore/utility.h"
69 static MagickBooleanType
70 WriteCMYKImage(const ImageInfo *,Image *,ExceptionInfo *);
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
77 % R e a d C M Y K I m a g e %
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83 % ReadCMYKImage() reads an image of raw CMYK or CMYKA samples and returns it.
84 % It allocates the memory necessary for the new Image structure and returns a
85 % pointer to the new image.
87 % The format of the ReadCMYKImage method is:
89 % Image *ReadCMYKImage(const ImageInfo *image_info,
90 % ExceptionInfo *exception)
92 % A description of each parameter follows:
94 % o image_info: the image info.
96 % o exception: return any errors or warnings in this structure.
99 static Image *ReadCMYKImage(const ImageInfo *image_info,
100 ExceptionInfo *exception)
134 assert(image_info != (const ImageInfo *) NULL);
135 assert(image_info->signature == MagickCoreSignature);
136 if (image_info->debug != MagickFalse)
137 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
138 image_info->filename);
139 assert(exception != (ExceptionInfo *) NULL);
140 assert(exception->signature == MagickCoreSignature);
141 image=AcquireImage(image_info,exception);
142 if ((image->columns == 0) || (image->rows == 0))
143 ThrowReaderException(OptionError,"MustSpecifyImageSize");
144 status=SetImageExtent(image,image->columns,image->rows,exception);
145 if (status == MagickFalse)
146 return(DestroyImageList(image));
147 (void) SetImageColorspace(image,CMYKColorspace,exception);
148 if (image_info->interlace != PartitionInterlace)
150 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
151 if (status == MagickFalse)
153 image=DestroyImageList(image);
154 return((Image *) NULL);
156 if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse)
157 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
161 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
163 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
165 if (canvas_image == (Image *) NULL)
166 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
167 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod,
169 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
170 if (quantum_info == (QuantumInfo *) NULL)
171 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
172 quantum_type=CMYKQuantum;
173 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
175 quantum_type=CMYKAQuantum;
176 image->alpha_trait=BlendPixelTrait;
178 pixels=(const unsigned char *) NULL;
179 if (image_info->number_scenes != 0)
180 while (image->scene < image_info->scene)
186 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
187 for (y=0; y < (ssize_t) image->rows; y++)
189 pixels=(const unsigned char *) ReadBlobStream(image,length,
190 GetQuantumPixels(quantum_info),&count);
191 if (count != (ssize_t) length)
202 Read pixels to virtual canvas image then push to image.
204 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
205 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
207 status=SetImageExtent(image,image->columns,image->rows,exception);
208 if (status == MagickFalse)
210 if (SetImageColorspace(image,CMYKColorspace,exception) == MagickFalse)
212 switch (image_info->interlace)
218 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
222 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
223 pixels=(const unsigned char *) ReadBlobStream(image,length,
224 GetQuantumPixels(quantum_info),&count);
226 for (y=0; y < (ssize_t) image->extract_info.height; y++)
228 register const Quantum
237 if (count != (ssize_t) length)
240 ThrowFileException(exception,CorruptImageError,
241 "UnexpectedEndOfFile",image->filename);
244 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
246 if (q == (Quantum *) NULL)
248 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
249 quantum_info,quantum_type,pixels,exception);
250 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
252 if (((y-image->extract_info.y) >= 0) &&
253 ((y-image->extract_info.y) < (ssize_t) image->rows))
255 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
256 canvas_image->columns,1,exception);
257 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
258 image->columns,1,exception);
259 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
261 for (x=0; x < (ssize_t) image->columns; x++)
263 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
264 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
265 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
266 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
267 SetPixelAlpha(image,OpaqueAlpha,q);
268 if (image->alpha_trait != UndefinedPixelTrait)
269 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
270 p+=GetPixelChannels(canvas_image);
271 q+=GetPixelChannels(image);
273 if (SyncAuthenticPixels(image,exception) == MagickFalse)
276 if (image->previous == (Image *) NULL)
278 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
280 if (status == MagickFalse)
283 pixels=(const unsigned char *) ReadBlobStream(image,length,
284 GetQuantumPixels(quantum_info),&count);
301 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
305 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
306 pixels=(const unsigned char *) ReadBlobStream(image,length,
307 GetQuantumPixels(quantum_info),&count);
309 for (y=0; y < (ssize_t) image->extract_info.height; y++)
311 register const Quantum
320 if (count != (ssize_t) length)
323 ThrowFileException(exception,CorruptImageError,
324 "UnexpectedEndOfFile",image->filename);
327 for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 5 : 4); i++)
329 quantum_type=quantum_types[i];
330 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
332 if (q == (Quantum *) NULL)
334 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
335 quantum_info,quantum_type,pixels,exception);
336 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
338 if (((y-image->extract_info.y) >= 0) &&
339 ((y-image->extract_info.y) < (ssize_t) image->rows))
341 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
342 0,canvas_image->columns,1,exception);
343 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
344 image->columns,1,exception);
345 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
347 for (x=0; x < (ssize_t) image->columns; x++)
349 switch (quantum_type)
353 SetPixelCyan(image,GetPixelCyan(canvas_image,p),q);
358 SetPixelMagenta(image,GetPixelMagenta(canvas_image,p),q);
363 SetPixelYellow(image,GetPixelYellow(canvas_image,p),q);
368 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
373 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
379 p+=GetPixelChannels(canvas_image);
380 q+=GetPixelChannels(image);
382 if (SyncAuthenticPixels(image,exception) == MagickFalse)
385 pixels=(const unsigned char *) ReadBlobStream(image,length,
386 GetQuantumPixels(quantum_info),&count);
388 if (image->previous == (Image *) NULL)
390 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
392 if (status == MagickFalse)
401 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
405 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
406 pixels=(const unsigned char *) ReadBlobStream(image,length,
407 GetQuantumPixels(quantum_info),&count);
409 for (y=0; y < (ssize_t) image->extract_info.height; y++)
411 register const Quantum
420 if (count != (ssize_t) length)
423 ThrowFileException(exception,CorruptImageError,
424 "UnexpectedEndOfFile",image->filename);
427 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
429 if (q == (Quantum *) NULL)
431 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
432 quantum_info,CyanQuantum,pixels,exception);
433 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
435 if (((y-image->extract_info.y) >= 0) &&
436 ((y-image->extract_info.y) < (ssize_t) image->rows))
438 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
439 canvas_image->columns,1,exception);
440 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
441 image->columns,1,exception);
442 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
444 for (x=0; x < (ssize_t) image->columns; x++)
446 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
447 p+=GetPixelChannels(canvas_image);
448 q+=GetPixelChannels(image);
450 if (SyncAuthenticPixels(image,exception) == MagickFalse)
453 pixels=(const unsigned char *) ReadBlobStream(image,length,
454 GetQuantumPixels(quantum_info),&count);
456 if (image->previous == (Image *) NULL)
458 status=SetImageProgress(image,LoadImageTag,1,6);
459 if (status == MagickFalse)
462 for (y=0; y < (ssize_t) image->extract_info.height; y++)
464 register const Quantum
473 if (count != (ssize_t) length)
476 ThrowFileException(exception,CorruptImageError,
477 "UnexpectedEndOfFile",image->filename);
480 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
482 if (q == (Quantum *) NULL)
484 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
485 quantum_info,MagentaQuantum,pixels,exception);
486 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
488 if (((y-image->extract_info.y) >= 0) &&
489 ((y-image->extract_info.y) < (ssize_t) image->rows))
491 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
492 canvas_image->columns,1,exception);
493 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
494 image->columns,1,exception);
495 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
497 for (x=0; x < (ssize_t) image->columns; x++)
499 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
500 p+=GetPixelChannels(canvas_image);
501 q+=GetPixelChannels(image);
503 if (SyncAuthenticPixels(image,exception) == MagickFalse)
506 pixels=(const unsigned char *) ReadBlobStream(image,length,
507 GetQuantumPixels(quantum_info),&count);
509 if (image->previous == (Image *) NULL)
511 status=SetImageProgress(image,LoadImageTag,2,6);
512 if (status == MagickFalse)
515 for (y=0; y < (ssize_t) image->extract_info.height; y++)
517 register const Quantum
526 if (count != (ssize_t) length)
529 ThrowFileException(exception,CorruptImageError,
530 "UnexpectedEndOfFile",image->filename);
533 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
535 if (q == (Quantum *) NULL)
537 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
538 quantum_info,YellowQuantum,pixels,exception);
539 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
541 if (((y-image->extract_info.y) >= 0) &&
542 ((y-image->extract_info.y) < (ssize_t) image->rows))
544 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
545 canvas_image->columns,1,exception);
546 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
547 image->columns,1,exception);
548 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
550 for (x=0; x < (ssize_t) image->columns; x++)
552 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
553 p+=GetPixelChannels(canvas_image);
554 q+=GetPixelChannels(image);
556 if (SyncAuthenticPixels(image,exception) == MagickFalse)
559 pixels=(const unsigned char *) ReadBlobStream(image,length,
560 GetQuantumPixels(quantum_info),&count);
562 if (image->previous == (Image *) NULL)
564 status=SetImageProgress(image,LoadImageTag,3,6);
565 if (status == MagickFalse)
568 for (y=0; y < (ssize_t) image->extract_info.height; y++)
570 register const Quantum
579 if (count != (ssize_t) length)
582 ThrowFileException(exception,CorruptImageError,
583 "UnexpectedEndOfFile",image->filename);
586 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
588 if (q == (Quantum *) NULL)
590 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
591 quantum_info,BlackQuantum,pixels,exception);
592 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
594 if (((y-image->extract_info.y) >= 0) &&
595 ((y-image->extract_info.y) < (ssize_t) image->rows))
597 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
598 canvas_image->columns,1,exception);
599 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
600 image->columns,1,exception);
601 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
603 for (x=0; x < (ssize_t) image->columns; x++)
605 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
606 p+=GetPixelChannels(canvas_image);
607 q+=GetPixelChannels(image);
609 if (SyncAuthenticPixels(image,exception) == MagickFalse)
612 pixels=(const unsigned char *) ReadBlobStream(image,length,
613 GetQuantumPixels(quantum_info),&count);
615 if (image->previous == (Image *) NULL)
617 status=SetImageProgress(image,LoadImageTag,4,6);
618 if (status == MagickFalse)
621 if (image->alpha_trait != UndefinedPixelTrait)
623 for (y=0; y < (ssize_t) image->extract_info.height; y++)
625 register const Quantum
634 if (count != (ssize_t) length)
637 ThrowFileException(exception,CorruptImageError,
638 "UnexpectedEndOfFile",image->filename);
641 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
643 if (q == (Quantum *) NULL)
645 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
646 quantum_info,AlphaQuantum,pixels,exception);
647 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
649 if (((y-image->extract_info.y) >= 0) &&
650 ((y-image->extract_info.y) < (ssize_t) image->rows))
652 p=GetVirtualPixels(canvas_image,
653 canvas_image->extract_info.x,0,canvas_image->columns,1,
655 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
656 image->columns,1,exception);
657 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
659 for (x=0; x < (ssize_t) image->columns; x++)
661 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
662 p+=GetPixelChannels(canvas_image);
663 q+=GetPixelChannels(image);
665 if (SyncAuthenticPixels(image,exception) == MagickFalse)
668 pixels=(const unsigned char *) ReadBlobStream(image,length,
669 GetQuantumPixels(quantum_info),&count);
671 if (image->previous == (Image *) NULL)
673 status=SetImageProgress(image,LoadImageTag,5,6);
674 if (status == MagickFalse)
678 if (image->previous == (Image *) NULL)
680 status=SetImageProgress(image,LoadImageTag,6,6);
681 if (status == MagickFalse)
686 case PartitionInterlace:
689 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
691 AppendImageFormat("C",image->filename);
692 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
693 if (status == MagickFalse)
695 canvas_image=DestroyImageList(canvas_image);
696 image=DestroyImageList(image);
697 return((Image *) NULL);
699 if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse)
700 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
702 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
703 for (i=0; i < (ssize_t) scene; i++)
704 for (y=0; y < (ssize_t) image->extract_info.height; y++)
706 pixels=(const unsigned char *) ReadBlobStream(image,length,
707 GetQuantumPixels(quantum_info),&count);
708 if (count != (ssize_t) length)
711 ThrowFileException(exception,CorruptImageError,
712 "UnexpectedEndOfFile",image->filename);
716 pixels=(const unsigned char *) ReadBlobStream(image,length,
717 GetQuantumPixels(quantum_info),&count);
718 for (y=0; y < (ssize_t) image->extract_info.height; y++)
720 register const Quantum
729 if (count != (ssize_t) length)
732 ThrowFileException(exception,CorruptImageError,
733 "UnexpectedEndOfFile",image->filename);
736 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
738 if (q == (Quantum *) NULL)
740 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
741 quantum_info,CyanQuantum,pixels,exception);
742 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
744 if (((y-image->extract_info.y) >= 0) &&
745 ((y-image->extract_info.y) < (ssize_t) image->rows))
747 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
748 canvas_image->columns,1,exception);
749 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
750 image->columns,1,exception);
751 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
753 for (x=0; x < (ssize_t) image->columns; x++)
755 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
756 p+=GetPixelChannels(canvas_image);
757 q+=GetPixelChannels(image);
759 if (SyncAuthenticPixels(image,exception) == MagickFalse)
762 pixels=(const unsigned char *) ReadBlobStream(image,length,
763 GetQuantumPixels(quantum_info),&count);
765 if (image->previous == (Image *) NULL)
767 status=SetImageProgress(image,LoadImageTag,1,5);
768 if (status == MagickFalse)
771 (void) CloseBlob(image);
772 AppendImageFormat("M",image->filename);
773 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
774 if (status == MagickFalse)
776 canvas_image=DestroyImageList(canvas_image);
777 image=DestroyImageList(image);
778 return((Image *) NULL);
780 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
781 for (i=0; i < (ssize_t) scene; i++)
782 for (y=0; y < (ssize_t) image->extract_info.height; y++)
784 pixels=(const unsigned char *) ReadBlobStream(image,length,
785 GetQuantumPixels(quantum_info),&count);
786 if (count != (ssize_t) length)
789 ThrowFileException(exception,CorruptImageError,
790 "UnexpectedEndOfFile",image->filename);
794 pixels=(const unsigned char *) ReadBlobStream(image,length,
795 GetQuantumPixels(quantum_info),&count);
796 for (y=0; y < (ssize_t) image->extract_info.height; y++)
798 register const Quantum
807 if (count != (ssize_t) length)
810 ThrowFileException(exception,CorruptImageError,
811 "UnexpectedEndOfFile",image->filename);
814 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
816 if (q == (Quantum *) NULL)
818 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
819 quantum_info,MagentaQuantum,pixels,exception);
820 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
822 if (((y-image->extract_info.y) >= 0) &&
823 ((y-image->extract_info.y) < (ssize_t) image->rows))
825 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
826 canvas_image->columns,1,exception);
827 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
828 image->columns,1,exception);
829 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
831 for (x=0; x < (ssize_t) image->columns; x++)
833 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
834 p+=GetPixelChannels(canvas_image);
835 q+=GetPixelChannels(image);
837 if (SyncAuthenticPixels(image,exception) == MagickFalse)
840 pixels=(const unsigned char *) ReadBlobStream(image,length,
841 GetQuantumPixels(quantum_info),&count);
843 if (image->previous == (Image *) NULL)
845 status=SetImageProgress(image,LoadImageTag,2,5);
846 if (status == MagickFalse)
849 (void) CloseBlob(image);
850 AppendImageFormat("Y",image->filename);
851 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
852 if (status == MagickFalse)
854 canvas_image=DestroyImageList(canvas_image);
855 image=DestroyImageList(image);
856 return((Image *) NULL);
858 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
859 for (i=0; i < (ssize_t) scene; i++)
860 for (y=0; y < (ssize_t) image->extract_info.height; y++)
862 pixels=(const unsigned char *) ReadBlobStream(image,length,
863 GetQuantumPixels(quantum_info),&count);
864 if (count != (ssize_t) length)
867 ThrowFileException(exception,CorruptImageError,
868 "UnexpectedEndOfFile",image->filename);
872 pixels=(const unsigned char *) ReadBlobStream(image,length,
873 GetQuantumPixels(quantum_info),&count);
874 for (y=0; y < (ssize_t) image->extract_info.height; y++)
876 register const Quantum
885 if (count != (ssize_t) length)
888 ThrowFileException(exception,CorruptImageError,
889 "UnexpectedEndOfFile",image->filename);
892 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
894 if (q == (Quantum *) NULL)
896 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
897 quantum_info,YellowQuantum,pixels,exception);
898 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
900 if (((y-image->extract_info.y) >= 0) &&
901 ((y-image->extract_info.y) < (ssize_t) image->rows))
903 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
904 canvas_image->columns,1,exception);
905 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
906 image->columns,1,exception);
907 if ((p == (const Quantum *) NULL) ||
908 (q == (Quantum *) NULL))
910 for (x=0; x < (ssize_t) image->columns; x++)
912 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
913 p+=GetPixelChannels(canvas_image);
914 q+=GetPixelChannels(image);
916 if (SyncAuthenticPixels(image,exception) == MagickFalse)
919 pixels=(const unsigned char *) ReadBlobStream(image,length,
920 GetQuantumPixels(quantum_info),&count);
922 if (image->previous == (Image *) NULL)
924 status=SetImageProgress(image,LoadImageTag,3,5);
925 if (status == MagickFalse)
928 (void) CloseBlob(image);
929 AppendImageFormat("K",image->filename);
930 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
931 if (status == MagickFalse)
933 canvas_image=DestroyImageList(canvas_image);
934 image=DestroyImageList(image);
935 return((Image *) NULL);
937 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
938 for (i=0; i < (ssize_t) scene; i++)
939 for (y=0; y < (ssize_t) image->extract_info.height; y++)
941 pixels=(const unsigned char *) ReadBlobStream(image,length,
942 GetQuantumPixels(quantum_info),&count);
943 if (count != (ssize_t) length)
946 ThrowFileException(exception,CorruptImageError,
947 "UnexpectedEndOfFile",image->filename);
951 pixels=(const unsigned char *) ReadBlobStream(image,length,
952 GetQuantumPixels(quantum_info),&count);
953 for (y=0; y < (ssize_t) image->extract_info.height; y++)
955 register const Quantum
964 if (count != (ssize_t) length)
967 ThrowFileException(exception,CorruptImageError,
968 "UnexpectedEndOfFile",image->filename);
971 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
973 if (q == (Quantum *) NULL)
975 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
976 quantum_info,BlackQuantum,pixels,exception);
977 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
979 if (((y-image->extract_info.y) >= 0) &&
980 ((y-image->extract_info.y) < (ssize_t) image->rows))
982 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
983 canvas_image->columns,1,exception);
984 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
985 image->columns,1,exception);
986 if ((p == (const Quantum *) NULL) ||
987 (q == (Quantum *) NULL))
989 for (x=0; x < (ssize_t) image->columns; x++)
991 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
992 p+=GetPixelChannels(canvas_image);
993 q+=GetPixelChannels(image);
995 if (SyncAuthenticPixels(image,exception) == MagickFalse)
998 pixels=(const unsigned char *) ReadBlobStream(image,length,
999 GetQuantumPixels(quantum_info),&count);
1001 if (image->previous == (Image *) NULL)
1003 status=SetImageProgress(image,LoadImageTag,3,5);
1004 if (status == MagickFalse)
1007 if (image->alpha_trait != UndefinedPixelTrait)
1009 (void) CloseBlob(image);
1010 AppendImageFormat("A",image->filename);
1011 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
1012 if (status == MagickFalse)
1014 canvas_image=DestroyImageList(canvas_image);
1015 image=DestroyImageList(image);
1016 return((Image *) NULL);
1018 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
1019 for (i=0; i < (ssize_t) scene; i++)
1020 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1022 pixels=(const unsigned char *) ReadBlobStream(image,length,
1023 GetQuantumPixels(quantum_info),&count);
1024 if (count != (ssize_t) length)
1027 ThrowFileException(exception,CorruptImageError,
1028 "UnexpectedEndOfFile",image->filename);
1032 pixels=(const unsigned char *) ReadBlobStream(image,length,
1033 GetQuantumPixels(quantum_info),
1035 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1037 register const Quantum
1046 if (count != (ssize_t) length)
1049 ThrowFileException(exception,CorruptImageError,
1050 "UnexpectedEndOfFile",image->filename);
1053 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
1055 if (q == (Quantum *) NULL)
1057 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
1058 quantum_info,YellowQuantum,pixels,exception);
1059 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1061 if (((y-image->extract_info.y) >= 0) &&
1062 ((y-image->extract_info.y) < (ssize_t) image->rows))
1064 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1065 0,canvas_image->columns,1,exception);
1066 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1067 image->columns,1,exception);
1068 if ((p == (const Quantum *) NULL) ||
1069 (q == (Quantum *) NULL))
1071 for (x=0; x < (ssize_t) image->columns; x++)
1073 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
1074 p+=GetPixelChannels(canvas_image);
1075 q+=GetPixelChannels(image);
1077 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1080 pixels=(const unsigned char *) ReadBlobStream(image,length,
1081 GetQuantumPixels(quantum_info),&count);
1083 if (image->previous == (Image *) NULL)
1085 status=SetImageProgress(image,LoadImageTag,4,5);
1086 if (status == MagickFalse)
1090 if (image->previous == (Image *) NULL)
1092 status=SetImageProgress(image,LoadImageTag,5,5);
1093 if (status == MagickFalse)
1099 SetQuantumImageType(image,quantum_type);
1101 Proceed to next image.
1103 if (image_info->number_scenes != 0)
1104 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1106 if (count == (ssize_t) length)
1109 Allocate next image structure.
1111 AcquireNextImage(image_info,image,exception);
1112 if (GetNextImageInList(image) == (Image *) NULL)
1114 image=DestroyImageList(image);
1115 return((Image *) NULL);
1117 image=SyncNextImageInList(image);
1118 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1119 GetBlobSize(image));
1120 if (status == MagickFalse)
1124 } while (count == (ssize_t) length);
1125 quantum_info=DestroyQuantumInfo(quantum_info);
1126 canvas_image=DestroyImage(canvas_image);
1127 (void) CloseBlob(image);
1128 if (status == MagickFalse)
1129 return(DestroyImageList(image));
1130 return(GetFirstImageInList(image));
1134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1138 % R e g i s t e r C M Y K I m a g e %
1142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1144 % RegisterCMYKImage() adds attributes for the CMYK image format to
1145 % the list of supported formats. The attributes include the image format
1146 % tag, a method to read and/or write the format, whether the format
1147 % supports the saving of more than one frame to the same file or blob,
1148 % whether the format supports native in-memory I/O, and a brief
1149 % description of the format.
1151 % The format of the RegisterCMYKImage method is:
1153 % size_t RegisterCMYKImage(void)
1156 ModuleExport size_t RegisterCMYKImage(void)
1161 entry=AcquireMagickInfo("CMYK","CMYK",
1162 "Raw cyan, magenta, yellow, and black samples");
1163 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1164 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1165 entry->flags|=CoderRawSupportFlag;
1166 entry->flags|=CoderEndianSupportFlag;
1167 (void) RegisterMagickInfo(entry);
1168 entry=AcquireMagickInfo("CMYK","CMYKA",
1169 "Raw cyan, magenta, yellow, black, and alpha samples");
1170 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1171 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1172 entry->flags|=CoderRawSupportFlag;
1173 entry->flags|=CoderEndianSupportFlag;
1174 (void) RegisterMagickInfo(entry);
1175 return(MagickImageCoderSignature);
1179 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1183 % U n r e g i s t e r C M Y K I m a g e %
1187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1189 % UnregisterCMYKImage() removes format registrations made by the
1190 % CMYK module from the list of supported formats.
1192 % The format of the UnregisterCMYKImage method is:
1194 % UnregisterCMYKImage(void)
1197 ModuleExport void UnregisterCMYKImage(void)
1199 (void) UnregisterMagickInfo("CMYK");
1200 (void) UnregisterMagickInfo("CMYKA");
1204 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1208 % W r i t e C M Y K I m a g e %
1212 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1214 % WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1215 % black,rasterfile format.
1217 % The format of the WriteCMYKImage method is:
1219 % MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1220 % Image *image,ExceptionInfo *exception)
1222 % A description of each parameter follows.
1224 % o image_info: the image info.
1226 % o image: The image.
1228 % o exception: return any errors or warnings in this structure.
1231 static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1232 Image *image,ExceptionInfo *exception)
1257 Allocate memory for pixels.
1259 assert(image_info != (const ImageInfo *) NULL);
1260 assert(image_info->signature == MagickCoreSignature);
1261 assert(image != (Image *) NULL);
1262 assert(image->signature == MagickCoreSignature);
1263 if (image->debug != MagickFalse)
1264 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1265 if (image_info->interlace != PartitionInterlace)
1268 Open output image file.
1270 status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
1271 if (status == MagickFalse)
1278 Convert MIFF to CMYK raster pixels.
1280 if (image->colorspace != CMYKColorspace)
1281 (void) TransformImageColorspace(image,CMYKColorspace,exception);
1282 quantum_type=CMYKQuantum;
1283 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1285 quantum_type=CMYKAQuantum;
1286 if (image->alpha_trait == UndefinedPixelTrait)
1287 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel,exception);
1289 quantum_info=AcquireQuantumInfo(image_info,image);
1290 if (quantum_info == (QuantumInfo *) NULL)
1291 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
1292 pixels=(unsigned char *) GetQuantumPixels(quantum_info);
1293 switch (image_info->interlace)
1299 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1301 for (y=0; y < (ssize_t) image->rows; y++)
1303 register const Quantum
1306 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1307 if (p == (const Quantum *) NULL)
1309 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1310 quantum_type,pixels,exception);
1311 count=WriteBlob(image,length,pixels);
1312 if (count != (ssize_t) length)
1314 if (image->previous == (Image *) NULL)
1316 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1318 if (status == MagickFalse)
1327 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1329 for (y=0; y < (ssize_t) image->rows; y++)
1331 register const Quantum
1334 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1335 if (p == (const Quantum *) NULL)
1337 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1338 CyanQuantum,pixels,exception);
1339 count=WriteBlob(image,length,pixels);
1340 if (count != (ssize_t) length)
1342 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1343 MagentaQuantum,pixels,exception);
1344 count=WriteBlob(image,length,pixels);
1345 if (count != (ssize_t) length)
1347 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1348 YellowQuantum,pixels,exception);
1349 count=WriteBlob(image,length,pixels);
1350 if (count != (ssize_t) length)
1352 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1353 BlackQuantum,pixels,exception);
1354 count=WriteBlob(image,length,pixels);
1355 if (count != (ssize_t) length)
1357 if (quantum_type == CMYKAQuantum)
1359 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1360 AlphaQuantum,pixels,exception);
1361 count=WriteBlob(image,length,pixels);
1362 if (count != (ssize_t) length)
1365 if (image->previous == (Image *) NULL)
1367 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1369 if (status == MagickFalse)
1375 case PlaneInterlace:
1378 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1380 for (y=0; y < (ssize_t) image->rows; y++)
1382 register const Quantum
1385 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1386 if (p == (const Quantum *) NULL)
1388 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1389 CyanQuantum,pixels,exception);
1390 count=WriteBlob(image,length,pixels);
1391 if (count != (ssize_t) length)
1394 if (image->previous == (Image *) NULL)
1396 status=SetImageProgress(image,SaveImageTag,1,6);
1397 if (status == MagickFalse)
1400 for (y=0; y < (ssize_t) image->rows; y++)
1402 register const Quantum
1405 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1406 if (p == (const Quantum *) NULL)
1408 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1409 MagentaQuantum,pixels,exception);
1410 count=WriteBlob(image,length,pixels);
1411 if (count != (ssize_t) length)
1414 if (image->previous == (Image *) NULL)
1416 status=SetImageProgress(image,SaveImageTag,2,6);
1417 if (status == MagickFalse)
1420 for (y=0; y < (ssize_t) image->rows; y++)
1422 register const Quantum
1425 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1426 if (p == (const Quantum *) NULL)
1428 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1429 YellowQuantum,pixels,exception);
1430 count=WriteBlob(image,length,pixels);
1431 if (count != (ssize_t) length)
1434 if (image->previous == (Image *) NULL)
1436 status=SetImageProgress(image,SaveImageTag,3,6);
1437 if (status == MagickFalse)
1440 for (y=0; y < (ssize_t) image->rows; y++)
1442 register const Quantum
1445 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1446 if (p == (const Quantum *) NULL)
1448 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1449 BlackQuantum,pixels,exception);
1450 count=WriteBlob(image,length,pixels);
1451 if (count != (ssize_t) length)
1454 if (image->previous == (Image *) NULL)
1456 status=SetImageProgress(image,SaveImageTag,4,6);
1457 if (status == MagickFalse)
1460 if (quantum_type == CMYKAQuantum)
1462 for (y=0; y < (ssize_t) image->rows; y++)
1464 register const Quantum
1467 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1468 if (p == (const Quantum *) NULL)
1470 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1471 AlphaQuantum,pixels,exception);
1472 count=WriteBlob(image,length,pixels);
1473 if (count != (ssize_t) length)
1476 if (image->previous == (Image *) NULL)
1478 status=SetImageProgress(image,SaveImageTag,5,6);
1479 if (status == MagickFalse)
1483 if (image_info->interlace == PartitionInterlace)
1484 (void) CopyMagickString(image->filename,image_info->filename,
1486 if (image->previous == (Image *) NULL)
1488 status=SetImageProgress(image,SaveImageTag,6,6);
1489 if (status == MagickFalse)
1494 case PartitionInterlace:
1497 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1499 AppendImageFormat("C",image->filename);
1500 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1501 AppendBinaryBlobMode,exception);
1502 if (status == MagickFalse)
1504 for (y=0; y < (ssize_t) image->rows; y++)
1506 register const Quantum
1509 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1510 if (p == (const Quantum *) NULL)
1512 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1513 CyanQuantum,pixels,exception);
1514 count=WriteBlob(image,length,pixels);
1515 if (count != (ssize_t) length)
1518 if (image->previous == (Image *) NULL)
1520 status=SetImageProgress(image,SaveImageTag,1,6);
1521 if (status == MagickFalse)
1524 (void) CloseBlob(image);
1525 AppendImageFormat("M",image->filename);
1526 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1527 AppendBinaryBlobMode,exception);
1528 if (status == MagickFalse)
1530 for (y=0; y < (ssize_t) image->rows; y++)
1532 register const Quantum
1535 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1536 if (p == (const Quantum *) NULL)
1538 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1539 MagentaQuantum,pixels,exception);
1540 count=WriteBlob(image,length,pixels);
1541 if (count != (ssize_t) length)
1544 if (image->previous == (Image *) NULL)
1546 status=SetImageProgress(image,SaveImageTag,2,6);
1547 if (status == MagickFalse)
1550 (void) CloseBlob(image);
1551 AppendImageFormat("Y",image->filename);
1552 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1553 AppendBinaryBlobMode,exception);
1554 if (status == MagickFalse)
1556 for (y=0; y < (ssize_t) image->rows; y++)
1558 register const Quantum
1561 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1562 if (p == (const Quantum *) NULL)
1564 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1565 YellowQuantum,pixels,exception);
1566 count=WriteBlob(image,length,pixels);
1567 if (count != (ssize_t) length)
1570 if (image->previous == (Image *) NULL)
1572 status=SetImageProgress(image,SaveImageTag,3,6);
1573 if (status == MagickFalse)
1576 (void) CloseBlob(image);
1577 AppendImageFormat("K",image->filename);
1578 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1579 AppendBinaryBlobMode,exception);
1580 if (status == MagickFalse)
1582 for (y=0; y < (ssize_t) image->rows; y++)
1584 register const Quantum
1587 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1588 if (p == (const Quantum *) NULL)
1590 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1591 BlackQuantum,pixels,exception);
1592 count=WriteBlob(image,length,pixels);
1593 if (count != (ssize_t) length)
1596 if (image->previous == (Image *) NULL)
1598 status=SetImageProgress(image,SaveImageTag,4,6);
1599 if (status == MagickFalse)
1602 if (quantum_type == CMYKAQuantum)
1604 (void) CloseBlob(image);
1605 AppendImageFormat("A",image->filename);
1606 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1607 AppendBinaryBlobMode,exception);
1608 if (status == MagickFalse)
1610 for (y=0; y < (ssize_t) image->rows; y++)
1612 register const Quantum
1615 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1616 if (p == (const Quantum *) NULL)
1618 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1619 AlphaQuantum,pixels,exception);
1620 count=WriteBlob(image,length,pixels);
1621 if (count != (ssize_t) length)
1624 if (image->previous == (Image *) NULL)
1626 status=SetImageProgress(image,SaveImageTag,5,6);
1627 if (status == MagickFalse)
1631 (void) CloseBlob(image);
1632 (void) CopyMagickString(image->filename,image_info->filename,
1634 if (image->previous == (Image *) NULL)
1636 status=SetImageProgress(image,SaveImageTag,6,6);
1637 if (status == MagickFalse)
1643 quantum_info=DestroyQuantumInfo(quantum_info);
1644 if (GetNextImageInList(image) == (Image *) NULL)
1646 image=SyncNextImageInList(image);
1647 status=SetImageProgress(image,SaveImagesTag,scene++,
1648 GetImageListLength(image));
1649 if (status == MagickFalse)
1651 } while (image_info->adjoin != MagickFalse);
1652 (void) CloseBlob(image);