Advertisement
Guest User

Untitled

a guest
Jul 24th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. import logging
  2. from distutils import log
  3.  
  4. logging.basicConfig(level=logging.DEBUG)
  5.  
  6. log.set_verbosity(log.DEBUG)
  7.  
  8.  
  9. from cffi import FFI
  10.  
  11.  
  12. ffi = FFI()
  13.  
  14. SOURCE_CODE = """
  15. typedef struct FLIF_IMAGE FLIF_IMAGE;
  16. typedef struct FLIF_DECODER FLIF_DECODER;
  17.  
  18. FLIF_IMAGE* flif_create_image(uint32_t width, uint32_t height);
  19. void flif_destroy_image(FLIF_IMAGE* image);
  20.  
  21. uint32_t flif_image_get_width(FLIF_IMAGE* image);
  22. uint32_t flif_image_get_height(FLIF_IMAGE* image);
  23. uint8_t flif_image_get_nb_channels(FLIF_IMAGE* image);
  24. uint32_t flif_image_get_frame_delay(FLIF_IMAGE* image);
  25.  
  26. void flif_image_write_row_RGBA8(FLIF_IMAGE* image, uint32_t row, const void* buffer, size_t buffer_size_bytes);
  27. void flif_image_read_row_RGBA8(FLIF_IMAGE* image, uint32_t row, void* buffer, size_t buffer_size_bytes);
  28.  
  29. void flif_free_memory(void* buffer);
  30.  
  31.  
  32. FLIF_DECODER* flif_create_decoder();
  33. int32_t flif_abort_decoder(FLIF_DECODER* decoder);
  34. void flif_destroy_decoder(FLIF_DECODER* decoder);
  35.  
  36. void flif_decoder_set_quality(FLIF_DECODER* decoder, int32_t quality);
  37. void flif_decoder_set_scale(FLIF_DECODER* decoder, uint32_t scale);
  38. void flif_decoder_set_callback(FLIF_DECODER* decoder, uint32_t (*callback)(int32_t quality, int64_t bytes_read));
  39. void flif_decoder_set_first_callback_quality(FLIF_DECODER* decoder, int32_t quality);
  40.  
  41. int32_t flif_decoder_decode_file(FLIF_DECODER* decoder, const char* filename);
  42. int32_t flif_decoder_decode_memory(FLIF_DECODER* decoder, const void* buffer, size_t buffer_size_bytes);
  43. size_t flif_decoder_num_images(FLIF_DECODER* decoder);
  44. int32_t flif_decoder_num_loops(FLIF_DECODER* decoder);
  45. FLIF_IMAGE* flif_decoder_get_image(FLIF_DECODER* decoder, size_t index);
  46. """
  47.  
  48. ffi.set_source(
  49. '_libflif',
  50. """
  51. #include <stdint.h>
  52. #include <stddef.h>
  53. """ + SOURCE_CODE,
  54. libraries=['flif_dec'])
  55.  
  56. ffi.cdef(SOURCE_CODE)
  57.  
  58. if __name__ == '__main__':
  59. ffi.compile()
  60.  
  61. from _libflif import ffi, lib
  62.  
  63. import io
  64.  
  65. decoder = lib.flif_create_decoder()
  66. lib.flif_decoder_decode_file(decoder, b"test.flif")
  67. img = lib.flif_decoder_get_image(decoder, 0)
  68.  
  69. width = lib.flif_image_get_width(img)
  70. height = lib.flif_image_get_height(img)
  71. channels = lib.flif_image_get_nb_channels(img)
  72.  
  73. buffer = ffi.new("char[]", width*4)
  74.  
  75. fp = io.BytesIO()
  76.  
  77. for i in range(height):
  78. lib.flif_image_read_row_RGBA8(img, i, buffer, width*4)
  79. fp.write(ffi.buffer(buffer))
  80.  
  81. from PIL import Image
  82.  
  83. im = Image.new('RGBA', (width, height))
  84. im.frombytes(fp.getvalue())
  85. if channels == 3:
  86. im = im.convert('RGB')
  87. im.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement