Python подушка делает мои JPG в 3 раза больше - PullRequest
0 голосов
/ 09 июля 2020

Я использую Pillow для работы с некоторыми JPG-файлами. Когда я сохраняю измененный JPG, он в три раза больше оригинала. Я рисую только три прямоугольника и добавляю к изображению небольшую текстовую метку. Почему получившийся файл, обработанный Pillow, намного больше оригинала? Как мне приблизить размер к оригиналу?

Вот некоторая информация о версии и список файлов, чтобы вы могли увидеть некоторые действия по устранению неполадок, которые я пробовал. Файл image.jpg является оригиналом.

Версии и список файлов:

pi@raspberrypi:~ $ pip3 freeze | grep -i pil
Pillow==5.4.1
pi@raspberrypi:~ $ python3 --version
Python 3.7.3
pi@raspberrypi:~ ll image*
-rw-r--r-- 1 pi pi 106522 Jul  9 17:14 image2.jpg
-rw-r--r-- 1 pi pi 101431 Jul  9 17:14 imageconv.jpg
-rw-r--r-- 1 pi pi  35873 Jul  9 03:15 image.jpg
-rw-r--r-- 1 pi pi 104781 Jul  9 17:14 imageopt.jpg
-rw-r--r-- 1 pi pi 138430 Jul  9 17:14 imageq85.jpg
-rw-r--r-- 1 pi pi  35856 Jul  9 17:14 imageresaved.jpg

Код манипуляции с файлом:

def imageDecorate(event_dir, boxes):
    source_image = event_dir + "/image.jpg"
    dest_image = event_dir + "/image2.jpg"
    dest_image3 = event_dir + "/imageq85.jpg"
    dest_image4 = event_dir + "/imageopt.jpg"
    dest_image5 = event_dir + "/imageconv.jpg"
    dest_image6 = event_dir + "/imageresaved.jpg"
    if not isfile(source_image):
        return False
    base = Image.open(source_image).convert('RGBA')
    out3 = base.convert('CMYK')
    out4 = Image.open(source_image)

    # Draw rectangles and text label
    draw = ImageDraw.Draw(base)
    fnt = ImageFont.truetype("fonts/DejaVuSansMono.ttf", 12)
    for box in boxes:
        # Omitting irrelevant details. It's normal ImageDraw stuff ...
        draw.rectangle( [...])
        draw.rectangle( [...])
        draw.rectangle( [...])
        draw.text( [...] )
    out2 = base.convert('CMYK')

    # Write  to dest_image.
    out2.save(dest_image)   # image2 - manipulated image
    out2.save(dest_image3, quality=85)    # imageq85 - Expect it to be larger than image2
    out2.save(dest_image4, optimize=True) # imageopt - Expect it to be smaller than image2
    out3.save(dest_image5)  # imageconv - no editing, just convert -> RGBA -> CYMK
    out4.save(dest_image6)  # imageresaved - original image, resaved, no change

    return True

Я нахожу некоторые подсказки в заголовке файла, но я недостаточно знаю о файлах JPG, чтобы понимать и действовать в соответствии с подсказками.

Заголовок для исходного файла:

pi@raspberrypi:~ $ xxd image.jpg | head -20
00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001  ......JFIF......
00000010: 0001 0000 ffdb 0043 0008 0606 0706 0508  .......C........
00000020: 0707 0709 0908 0a0c 140d 0c0b 0b0c 1912  ................
00000030: 130f 141d 1a1f 1e1d 1a1c 1c20 242e 2720  ........... $.'
00000040: 222c 231c 1c28 3729 2c30 3134 3434 1f27  ",#..(7),01444.'
00000050: 393d 3832 3c2e 3334 32ff db00 4301 0909  9=82<.342...C...
00000060: 090c 0b0c 180d 0d18 3221 1c21 3232 3232  ........2!.!2222
00000070: 3232 3232 3232 3232 3232 3232 3232 3232  2222222222222222
00000080: 3232 3232 3232 3232 3232 3232 3232 3232  2222222222222222
00000090: 3232 3232 3232 3232 3232 3232 3232 ffc0  22222222222222..
000000a0: 0011 0801 5102 5803 0122 0002 1101 0311  ....Q.X.."......
000000b0: 01ff c400 1f00 0001 0501 0101 0101 0100  ................
000000c0: 0000 0000 0000 0001 0203 0405 0607 0809  ................
000000d0: 0a0b ffc4 00b5 1000 0201 0303 0204 0305  ................
000000e0: 0504 0400 0001 7d01 0203 0004 1105 1221  ......}........!
000000f0: 3141 0613 5161 0722 7114 3281 91a1 0823  1A..Qa."q.2....#
00000100: 42b1 c115 52d1 f024 3362 7282 090a 1617  B...R..$3br.....
00000110: 1819 1a25 2627 2829 2a34 3536 3738 393a  ...%&'()*456789:
00000120: 4344 4546 4748 494a 5354 5556 5758 595a  CDEFGHIJSTUVWXYZ
00000130: 6364 6566 6768 696a 7374 7576 7778 797a  cdefghijstuvwxyz

Заголовок для файла imageconv.jpg , который был просто преобразован в RGBA, а затем обратно в CMYK:

pi@raspberrypi:~ $ xxd imageconv.jpg | head -20
00000000: ffd8 ffee 000e 4164 6f62 6500 6400 0000  ......Adobe.d...
00000010: 0000 ffdb 0043 0008 0606 0706 0508 0707  .....C..........
00000020: 0709 0908 0a0c 140d 0c0b 0b0c 1912 130f  ................
00000030: 141d 1a1f 1e1d 1a1c 1c20 242e 2720 222c  ......... $.' ",
00000040: 231c 1c28 3729 2c30 3134 3434 1f27 393d  #..(7),01444.'9=
00000050: 3832 3c2e 3334 32ff c000 1408 0151 0258  82<.342......Q.X
00000060: 0443 1100 4d11 0059 1100 4b11 00ff c400  .C..M..Y..K.....
00000070: 1f00 0001 0501 0101 0101 0100 0000 0000  ................
00000080: 0000 0001 0203 0405 0607 0809 0a0b ffc4  ................
00000090: 00b5 1000 0201 0303 0204 0305 0504 0400  ................
000000a0: 0001 7d01 0203 0004 1105 1221 3141 0613  ..}........!1A..
000000b0: 5161 0722 7114 3281 91a1 0823 42b1 c115  Qa."q.2....#B...
000000c0: 52d1 f024 3362 7282 090a 1617 1819 1a25  R..$3br........%
000000d0: 2627 2829 2a34 3536 3738 393a 4344 4546  &'()*456789:CDEF
000000e0: 4748 494a 5354 5556 5758 595a 6364 6566  GHIJSTUVWXYZcdef
000000f0: 6768 696a 7374 7576 7778 797a 8384 8586  ghijstuvwxyz....
00000100: 8788 898a 9293 9495 9697 9899 9aa2 a3a4  ................
00000110: a5a6 a7a8 a9aa b2b3 b4b5 b6b7 b8b9 bac2  ................
00000120: c3c4 c5c6 c7c8 c9ca d2d3 d4d5 d6d7 d8d9  ................
00000130: dae1 e2e3 e4e5 e6e7 e8e9 eaf1 f2f3 f4f5  ................

Содержимое image.jpg : original image File imageconv.jpg is identical in appearance to image.jpg.

Contents of image2.jpg (note, this example has 9 rects and 3 text labels): измененное изображение

1 Ответ

0 голосов
/ 10 июля 2020

Проблема заключалась в двух шагах convert (). Они были совершенно ненужными.

Я получил достаточно подсказок из комментариев, чтобы попробовать рисовать прямо на изображении, а не преобразовывать его в RGBA, а затем обратно в CMYK. Я не знал, что смогу это сделать. Размеры файлов теперь более разумные.

pi@raspberrypi:~ $ ll image*
-rw-r--r-- 1 pi pi  38283 Jul 10 00:29 image2.jpg
-rw-r--r-- 1 pi pi 101431 Jul 10 00:29 imageconv.jpg
-rw-r--r-- 1 pi pi  35873 Jul  9 03:15 image.jpg
-rw-r--r-- 1 pi pi  37363 Jul 10 00:29 imageopt.jpg
-rw-r--r-- 1 pi pi  50024 Jul 10 00:29 imageq85.jpg
-rw-r--r-- 1 pi pi  35856 Jul 10 00:29 imageresaved.jpg

Измененный код (изображения для устранения неполадок сохранены для сравнения):

def imageDecorate(event_dir, boxes):
    source_image = event_dir + "/image.jpg"
    dest_image = event_dir + "/image2.jpg"
    dest_image3 = event_dir + "/imageq85.jpg"
    dest_image4 = event_dir + "/imageopt.jpg"
    dest_image5 = event_dir + "/imageconv.jpg"
    dest_image6 = event_dir + "/imageresaved.jpg"
    if not isfile(source_image):
        return False
    base = Image.open(source_image)
    out3 = base.convert('CMYK')
    out4 = Image.open(source_image)

    # Draw rectangles and text label
    draw = ImageDraw.Draw(base)
    fnt = ImageFont.truetype("fonts/DejaVuSansMono.ttf", 12)
    for box in boxes:
        # Omitting irrelevant details. It's normal ImageDraw stuff ...
        draw.rectangle( [...])
        draw.rectangle( [...])
        draw.rectangle( [...])
        draw.text( [...] )

    # Write  to dest_image.
    base.save(dest_image)   # image2 - manipulated image
    base.save(dest_image3, quality=85)    # imageq85 - Expect it to be larger than image2
    base.save(dest_image4, optimize=True) # imageopt - Expect it to be smaller than image2
    out3.save(dest_image5)  # imageconv - no editing, just convert -> RGBA -> CYMK
    out4.save(dest_image6)  # imageresaved - original image, resaved, no change

    return True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...