Sorl-thumbnail: ยซOSError: ๋ชจ๋“œ RGBA๋ฅผ JPEG๋กœ ์“ธ ์ˆ˜ ์—†์Œยป ๋ชจ๋“œ์—์„œ PNG์— ๋Œ€ํ•œ get_thumbnail=P์ผ ๋•Œ

์— ๋งŒ๋“  2018๋…„ 09์›” 16์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jazzband/sorl-thumbnail

๋‚ด๊ฐ€ ๋ญ˜ ํ•œ๊ฑฐ์ง€?

๋ชจ๋“œ=P(์ƒ‰์ธ ์ƒ‰์ธ?)์—์„œ PNG ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ถ•์†ŒํŒ(ํˆฌ๋ช…๋„๊ฐ€ ์—†๋Š” JPEG)์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
(๋ชจ๋“œ=RGBA์ธ PNG์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชจ๋“œ=P์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)

๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ์™ธ ์—†์ด ์ถ•์†ŒํŒ์„ ์ €์žฅํ•˜๊ณ  ์•ŒํŒŒ ์ฑ„๋„์„ ์ผ๋ถ€ ์ƒ‰์ƒ์˜ ๋‹จ์ƒ‰ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: THUMBNAIL_PADDING_COLOR, ์„ค์ •์˜ ํŠน์ • ์ƒ‰์ƒ ๋˜๋Š” 'ํฐ์ƒ‰').

ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€

5847e9aacef1014c0b5e4828
https://user-images.githubusercontent.com/244666/45594613-a5aba780-b9a6-11e8-9321-da6710f9fb4f.png

์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด?

>>> i = Image.open('forbes.png')
>>> i
<PIL.PngImagePlugin.PngImageFile image mode=P size=400x400 at 0x7FE650252CC0>

>>> get_thumbnail(i, '100x106', crop='center', quality=99, format='PNG')
<sorl.thumbnail.images.ImageFile at 0x7fe6501d6390>

>>> get_thumbnail(i, '100x100', crop='center', quality=99, format='JPEG')
OSError: cannot write mode RGBA as JPEG

๋ฒ„์ „

ํŒŒ์ด์ฌ == 3.6.5
๋ฒ ๊ฐœ == 5.2.0(๋˜๋Š” ๋ชจ๋“  ๋ฒ„์ „ >= 4.2.0)
์†”-์ธ๋„ค์ผ == 12.4.1

๊ด€๋ จ ๋ฌธ์ œ

https://github.com/python-pillow/Pillow/issues/2609

๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•?

ํŠน์ • ์ƒ‰์ƒ์œผ๋กœ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์†Œ์Šค ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    def _colorspace(self, image, colorspace, format):
        if colorspace == 'RGB':
            # Pillow JPEG doesn't allow RGBA anymore. It was converted to RGB before.
            if image.mode == 'RGBA' and format != 'JPEG':
                return image  # RGBA is just RGB + Alpha
            if image.mode == 'LA' or (image.mode == 'P' and 'transparency' in image.info):
                if format == 'JPEG':
                    newimage = Image.new('RGB', image.size, '#eebbaa')
                    mask = image.convert('RGBA').split()[-1]
                    newimage.paste(image.convert('RGBA'), (0, 0), mask)
                else:
                    newimage = image.convert('RGBA')
                    transparency = image.info.get('transparency')
                    if transparency is not None:
                        mask = image.convert('RGBA').split()[-1]
                        newimage.putalpha(mask)
                return newimage
            return image.convert('RGB')
        if colorspace == 'GRAY':
            return image.convert('L')
        return image

์ •ํ™•ํ•œ ๊ฒฐ๊ณผ

cor

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์˜๊ฒฌ์€ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PNG ํ˜•์‹์˜ ์ธ๋„ค์ผ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

THUMBNAIL_PRESERVE_FORMAT = True

์ด๊ฒƒ์€ PNG ์ด๋ฏธ์ง€๋ฅผ PNG ์ถ•์†ŒํŒ์œผ๋กœ ์ €์žฅํ•˜๋ฏ€๋กœ RGBA ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  7 ๋Œ“๊ธ€

์ด์— ๋Œ€ํ•œ PR์ด ์žˆ์Šต๋‹ˆ๊นŒ?

django rest ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•  ๋•Œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @stopdesign ์ด ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ๋„ฃ์–ด์•ผ ํ•˜๋‚˜์š”?

์ด ์˜๊ฒฌ์€ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PNG ํ˜•์‹์˜ ์ธ๋„ค์ผ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

THUMBNAIL_PRESERVE_FORMAT = True

์ด๊ฒƒ์€ PNG ์ด๋ฏธ์ง€๋ฅผ PNG ์ถ•์†ŒํŒ์œผ๋กœ ์ €์žฅํ•˜๋ฏ€๋กœ RGBA ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค :)

sorl์ด ์ด์ „์—๋Š” ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๊ฒฝ๊ณ ๋ฅผ ๋˜์ง€๋Š”๊ฒŒ ๋‚˜์„๊นŒ์š”?

๋”ฐ๋ผ์„œ ๋‚˜์—๊ฒŒ ์žˆ์–ด ๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” sorl์ด ํ˜•์‹์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด Pillow๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์‹ค์ œ๋กœ ํŒŒ์ผ์˜ ํ—ค๋”๋ฅผ ์ฝ๋Š” ๋Œ€์‹  ํŒŒ์ผ ํ™•์žฅ์ž ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ํ˜•์‹์„ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ jpg ํŒŒ์ผ์˜ ์ด๋ฆ„์„ png ํŒŒ์ผ๋กœ ์ž˜๋ชป ์ง€์ •ํ•œ ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• THUMBNAIL_PRESERVE_FORMAT = True ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ํŒจ์น˜๋Š” ์—”์ง„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋…๋ฆฝ์ ์ธ ๋ฌธ์ œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰