Сохранение изображения, хранящегося в BytesIO в подушке - PullRequest
0 голосов
/ 20 января 2020

У меня есть изображение, сохраненное как BytesIO в Pillow, и мне нужно сохранить его в файл с некоторой информацией заголовка (содержащей текстовые атрибуты), которую мне нужно добавить, указав c к моей проблеме. Мне нужно, чтобы байты были представлены в соответствии с некоторым форматом сжатия изображения. Это будет возможно? Если да, то как это можно сделать? Мне также нужно хранить более одного изображения в файле.

1 Ответ

2 голосов
/ 20 января 2020

Сохранение более одного изображения в файле проблематично c для PNG, JPEG и большинства распространенных форматов. Один из вариантов для этого - TIFF - вы не уверены, работает ли он для вас?

Вот как вы можете сохранить как минимум дополнительный текст в формате PNG:

#!/usr/bin/env python3

from PIL.PngImagePlugin import Image, PngInfo

# Create empty metadata and add a couple of text strings
metadata = PngInfo()
metadata.add_text("Key1:","Value1")
metadata.add_text("Key2:","Value2")

# Create red image and save with metadata embedded
im = Image.new('RGB',(64,64),'red')
im.save("result.png", pnginfo=metadata)

enter image description here

Если вы проверите это с помощью pngcheck, вы увидите:

pngcheck -7v result.png

Пример вывода

File: result.png (200 bytes)
  chunk IHDR at offset 0x0000c, length 13
    64 x 64 image, 24-bit RGB, non-interlaced
  chunk tEXt at offset 0x00025, length 12, keyword: Key1:
    Value1
  chunk tEXt at offset 0x0003d, length 12, keyword: Key2:
    Value2
  chunk IDAT at offset 0x00055, length 95
    zlib: deflated, 32K window, default compression
  chunk IEND at offset 0x000c0, length 0
No errors detected in result.png (5 chunks, 98.4% compression).

Вот как сохранить 3 изображения и комментарий в одном файле TIFF:

from PIL import Image 
from PIL.TiffImagePlugin import ImageFileDirectory_v2, TiffTags 

# Create a structure to hold meta-data
ifd = ImageFileDirectory_v2() 
ifd[270] = 'Some Funky Comment' 
ifd.tagtype[270] = TiffTags.ASCII 

# Create red image and save with metadata embedded 
im1 = Image.new('RGB',(50,50),'red') 
im2 = Image.new('RGB',(64,64),'green') 
im3 = Image.new('RGB',(80,80),'blue') 
im1.save("result.tif", append_images[im2,im3], save_all=True, tiffinfo=ifd)

И проверить это с помощью:

tiffinfo -v result.tif

Пример вывода

TIFF Directory at offset 0x8 (8)
  Image Width: 50 Image Length: 50
  Bits/Sample: 8
  Compression Scheme: None
  Photometric Interpretation: RGB color
  Samples/Pixel: 3
  Rows/Strip: 50
  Planar Configuration: single image plane
  ImageDescription: Some Funky Comment
TIFF Directory at offset 0x1e08 (7688)
  Image Width: 64 Image Length: 64
  Bits/Sample: 8
  Compression Scheme: None
  Photometric Interpretation: RGB color
  Samples/Pixel: 3
  Rows/Strip: 64
  Planar Configuration: single image plane
  ImageDescription: Some Funky Comment
TIFF Directory at offset 0x4eb8 (20152)
  Image Width: 80 Image Length: 80
  Bits/Sample: 8
  Compression Scheme: None
  Photometric Interpretation: RGB color
  Samples/Pixel: 3
  Rows/Strip: 80
  Planar Configuration: single image plane
  ImageDescription: Some Funky Comment

enter image description here


Затем вы можете извлекать изображения в командной строке с помощью ImageMagick следующим образом.

Чтобы извлечь первое изображение:

magick result.tif[0] first.png

Чтобы извлечь последнее изображение:

magick result.tif[-1] last.png

Чтобы извлечь все три изображения:

magick result.tif image-%d.png

Результат

-rw-r--r--  1 mark  staff  457 21 Jan 08:11 image-0.png
-rw-r--r--  1 mark  staff  458 21 Jan 08:11 image-1.png
-rw-r--r--  1 mark  staff  460 21 Jan 08:11 image-2.png 

Примечание. Используйте convert вместо magick выше, если вы используете v6 ImageMagick .

Ключевые слова : Python, PIL, обработка изображений, несколько изображений, TIF, комментарий, tiffinfo, IFD, PNG tEXt.

...