Почему цвета заливки искажаются в библиотеке изображений Python?

Я пытаюсь рисовать фигуры цветами с помощью этого чрезвычайно простого фрагмента кода:

from PIL import Image, ImageDraw

img = Image.new( "RGB", (256,256))
draw = ImageDraw.Draw(img)

draw.rectangle( [(0,0),(256,128)], fill="#FF0000" )
draw.rectangle( [(0,128),(256,256)], fill=0xFF0000 )

# img.show()
img.save("test.png")

Мой первый прямоугольник будет КРАСНЫМ, а второй — СИНИМ. Я знаю, что значения не совпадают: одно — строка, другое — целое число, но, очевидно, программа должна интерпретировать их одинаково, не так ли? Или я упускаю из виду какую-то простую вещь? Я рисую градиенты с целыми числами и обнаружил это странное поведение. Спасибо за любое руководство.


person dropout    schedule 07.03.2012    source источник


Ответы (2)


Что ж, поскольку вы не получили одинаковые цвета, очевидно, библиотека интерпретирует их по-разному.

В первой форме у вас есть цвет, как он указан в именах HTML и CSS — строка, и вы могли бы использовать слова «красный» и «синий» так же, как вы использовали «#ff0000». Во второй форме вы фактически передавая ему целое число, которое будет представлять цвет. Поскольку он показывает красный цвет вместо синего, порядок байтов при вводе цветов в этом формате меняется на противоположный — просто попробуйте вместо этого 0x0000FF. (т.е. вместо RGB используется BGR)

Если вы используете числа, а не строки, обратите внимание, что вы также можете отправить 3-кортеж со значениями RGB, как в draw.rectangle( [(0,128),(256,256)], fill=(255, 0,0) ) (при этом также используется RGB)

«Реальность — это то, что тебе сойдет с рук»

person jsbueno    schedule 07.03.2012
comment
Спасибо, проще говоря: ответ: библиотека интерпретирует простые целые числа как BGR, а не RGB, хотя я указал это в аргументе режима изображения? Я принимаю ваш ответ, потому что он включает в себя решение проблемы. - person dropout; 07.03.2012

Он не поддерживает это. Вот что поддерживается:

Названия цветов

В PIL 1.1.4 и более поздних версиях вы также можете использовать строковые константы при рисовании изображений «RGB». PIL поддерживает следующие форматы строк:

Шестнадцатеричные спецификаторы цвета, представленные как «#rgb» или «#rrggbb». Например, "#ff0000" указывает чистый красный цвет.

Функции RGB, заданные как «rgb (красный, зеленый, синий)», где значения цвета являются целыми числами в диапазоне от 0 до 255. В качестве альтернативы значения цвета могут быть представлены в виде трех процентов (от 0% до 100%). Например, «rgb(255,0,0)» и «rgb(100%,0%,0%)» указывают чистый красный цвет.

Функции оттенка-насыщенности-яркости (HSL), заданные как «hsl (оттенок, насыщенность%, яркость%)», где оттенок — это цвет, заданный как угол между 0 и 360 (красный = 0, зеленый = 120, синий = 240) , насыщенность — это значение от 0 % до 100 % (серый = 0 %, полный цвет = 100 %), а яркость — это значение от 0 % до 100 % (черный = 0 %, нормальный = 50 %, белый = 100 %). ). Например, «hsl(0,100%,50%)» — чисто красный.

Общие названия цветов HTML. ImageDraw предоставляет около 140 стандартных названий цветов, основанных на цветах, поддерживаемых системой X Window и большинством веб-браузеров. Имена цветов нечувствительны к регистру и могут содержать пробелы. Например, «красный» и «красный» указывают чистый красный цвет.

Модуль ImageDraw

person StefanE    schedule 07.03.2012
comment
Вы правы, там явно указано, что поддерживается. Я просто подумал, что подачи целых чисел достаточно, как это было со многими другими языками программирования и библиотеками обработки изображений, с которыми я работал, а также библиотека не выдавала ошибку, как если бы вы, возможно, передали неправильные кортежи... - person dropout; 07.03.2012
comment
Это с открытым исходным кодом - исправьте это для них! :) - person StefanE; 07.03.2012