try: im.encoderinfo = params # local image header _get_local_header(fp, im, offset, 0) ImageFile._save(im, fp, [("gif", (0, 0)+im.size, 0, RAWMODE[im.mode])]) fp.write(b"\0") # end of image data finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry Image.register_open(GifImageFile.format, GifImageFile, _accept) Image.register_save(GifImageFile.format, _save) Image.register_save_all(GifImageFile.format, _save_all) Image.register_extension(GifImageFile.format, ".gif") Image.register_mime(GifImageFile.format, "image/gif") # # Uncomment the following line if you wish to use NETPBM/PBMPLUS # instead of the built-in "uncompressed" GIF encoder # Image.register_save(GifImageFile.format, _save_netpbm)
from typing import List from PIL import Image, ImageFile # workaround initialization code from PIL.GifImagePlugin import GifImageFile, _accept, _save, _save_all class AnimatedGifImageFile(GifImageFile): def load_end(self): ImageFile.ImageFile.load_end(self) Image.register_open(AnimatedGifImageFile.format, AnimatedGifImageFile, _accept) Image.register_save(AnimatedGifImageFile.format, _save) Image.register_save_all(AnimatedGifImageFile.format, _save_all) Image.register_extension(AnimatedGifImageFile.format, ".gif") Image.register_mime(AnimatedGifImageFile.format, "image/gif") # end of workaround initialization code def get_frames(gif: Image.Image) -> List[Image.Image]: """ Extract all frames from gif. This function is just slight adjustment of the for-cycle from the workaround. """ last_frame = None all_frames = [] i = 0
# Write out the data for this frame to the output data_descriptor = QGFFrameDataDescriptorV1() data_descriptor.data = image_data vprint( f'{f"Frame {idx:3d} data":26s} {fp.tell():5d}d / {fp.tell():04X}h') data_descriptor.write(fp) # Iterate over each if the input frames, writing it to the output in the process _for_all_frames(_write_frame) # Go back and update the graphics descriptor now that we can determine the final file size graphics_descriptor.total_file_size = fp.tell() fp.seek(graphics_descriptor_location, 0) graphics_descriptor.write(fp) # Go back and update the frame offsets now that they're written to the file fp.seek(frame_offset_location, 0) frame_offsets.write(fp) ######################################################################################################################## # Register with PIL so that it knows about the QGF format Image.register_open(QGFImageFile.format, QGFImageFile, _accept) Image.register_save(QGFImageFile.format, _save) Image.register_save_all(QGFImageFile.format, _save) Image.register_extension(QGFImageFile.format, f".{QGFImageFile.format.lower()}") Image.register_mime(QGFImageFile.format, f"image/{QGFImageFile.format.lower()}")
struct.pack(">4sIH?H", b"030\x00", 17 + length, len(frames_buffers), 0, 1 if len(positions) > 1 else 0)) for buf in frames_buffers: fp.write(buf) def _debug(image): print('Info' + str(image.info)) for i in range(image.n_frames): image.seek(i) print("Frame #%d: mode: %s size=%dx%d" % (i, image.mode, image.size[0], image.size[1])) print("\tHeader: ", image.header) # # Registration # Image.register_open(FACImageFile.format, FACImageFile, _accept) Image.register_save(FACImageFile.format, _save) Image.register_save_all(FACImageFile.format, _save_all) Image.register_extension(FACImageFile.format, ".fac") Image.register_mime(FACImageFile.format, "image/fac") if __name__ == "__main__": import doctest doctest.testmod()
xref.append(fp.tell()) _obj(fp, pageNumber * 3 + 5, Length=len(op.fp.getvalue())) fp.write("stream\n") fp.fp.write(op.fp.getvalue()) fp.write("\nendstream\n") _endobj(fp) # # trailer startxref = fp.tell() fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) for x in xref[1:]: fp.write("%010d 00000 n \n" % x) fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) fp.write("startxref\n%d\n%%%%EOF\n" % startxref) if hasattr(fp, "flush"): fp.flush() # # -------------------------------------------------------------------- Image.register_save("PDF", _save) Image.register_save_all("PDF", _save_all) Image.register_extension("PDF", ".pdf") Image.register_mime("PDF", "application/pdf")
xref.append(fp.tell()) _obj(fp, pageNumber*3+5, Length=len(op.fp.getvalue())) fp.write("stream\n") fp.fp.write(op.fp.getvalue()) fp.write("\nendstream\n") _endobj(fp) # # trailer startxref = fp.tell() fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) for x in xref[1:]: fp.write("%010d 00000 n \n" % x) fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) fp.write("startxref\n%d\n%%%%EOF\n" % startxref) if hasattr(fp, "flush"): fp.flush() # # -------------------------------------------------------------------- Image.register_save("PDF", _save) Image.register_save_all("PDF", _save_all) Image.register_extension("PDF", ".pdf") Image.register_mime("PDF", "application/pdf")