Я также провел несколько экспериментов с libvips
и смог написать сжатые JPEG-файлы TIFF с контролируемым качеством следующим образом:
import numpy as np
import pyvips
# Set width, height and number of bands of image
h, w, bands = 480, 640, 3
# Initialise Numpy image and convert to VipsImage
n = np.random.randint(0,256,(h,w,bands), dtype=np.uint8)
linear = n.reshape(h*w*bands)
vi = pyvips.Image.new_from_memory(linear.data, w, h, bands,'uchar')
# Now save without compression, then with JPEG compression quality=60, 80, 90
vi.tiffsave('result-none.tif')
vi.tiffsave('result-60.tif', compression='jpeg', Q=60)
vi.tiffsave('result-80.tif', compression='jpeg', Q=80)
vi.tiffsave('result-90.tif', compression='jpeg', Q=90)
Проверить размеры соответствуют:
-rw-r--r-- 1 mark staff 921854 14 May 16:32 result-none.tif
-rw-r--r-- 1 mark staff 146266 14 May 16:32 result-60.tif
-rw-r--r-- 1 mark staff 205996 14 May 16:32 result-80.tif
-rw-r--r-- 1 mark staff 724649 14 May 16:32 result-90.tif
Команда tiffinfo
также определяет сжатие JPEG:
tiffinfo result-60.tif
TIFF Directory at offset 0x237de (145374)
Image Width: 640 Image Length: 480
Resolution: 10, 10 pixels/cm
Bits/Sample: 8
Sample Format: unsigned integer
Compression Scheme: JPEG
Photometric Interpretation: YCbCr
Orientation: row 0 top, col 0 lhs
Samples/Pixel: 3
Rows/Strip: 128
Planar Configuration: single image plane
Reference Black/White:
0: 0 255
1: 128 255
2: 128 255
JPEG Tables: (574 bytes)
Вы можете узнать, как конвертировать из pyvips
в numpy
и обратно здесь .
Аналогично вы можете конвертировать из PIL Image
в numpy
с помощью:
PILImage = Image.open('image.png')
numpyImage = np.array(PILImage)
и из numpy
изображения в PIL Image
с помощью:
PILImage = Image.fromarray(numpyImage)
Это означает, что вы должны иметь возможность смешивать открытие, закрытие и обработку изображений между PIL / Pillow, Numpy, scikit-image, OpenCV и vips.