Как сделать градиент в питоне
Перейти к содержимому

Как сделать градиент в питоне

  • автор:

Градиент

Author24 — интернет-сервис помощи студентам

Задача:
Напишите функцию gradient(color), создающую графический файл с плавным переходом цвета. Файл должен содержать прямоугольник длиной 512 пикселей (по 2 пикселя на каждый оттенок) и высотой 200 пикселей.
В функцию передается обозначение цвета, градиент которого надо построить. Варианты цветов: R, G и B. Обозначение может быть введено в любом регистре.
Вот мой код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from PIL import Image, ImageDraw def gradient(choose): new_image = Image.new("RGB", (512, 200), (0, 0, 0)) draw = ImageDraw.Draw(new_image) r = 0 g = 0 b = 0 for i in range(new_image.size[0]): draw.line((i, 0, i, 512), fill=(r, g, b), width=2) if i % 4 == 0: if choose == "R": r += 2 elif choose == "G": g += 2 else: b += 2 new_image.save("res.png", "PNG")

Файл res.png — это то, что получается у меня (1).
А другой — это то, что должно получиться (2).
Не знаю, что нужно подправить.

Как создать цветовой градиент в Python?

Изображение 48413

Я хочу создать новую цветочную карту, которая интерполирует между зеленым и синим (или любые другие два цвета, если на то пошло). Моя цель — получить что-то вроде: Прежде всего, я действительно не уверен, что это можно сделать, используя линейную интерполяцию синего и зеленого. Если это возможно, я не уверен, как это сделать, я нашел документацию по использованию метода matplotlib, который интерполирует указанные значения RGB здесь Настоящая проблема заключается в понимании того, как работает «cdict2». Например, в документации говорится: «Пример: предположим, что вы хотите, чтобы красный увеличился от 0 до 1 в нижней половине, зеленый, чтобы сделать то же самое в средней половине, а синий — в верхней половине. Затем вы будете использовать:»

from matplotlib import pyplot as plt import matplotlib import numpy as np plt.figure() a=np.outer(np.arange(0,1,0.01),np.ones(10)) cdict2 = my_cmap2 = matplotlib.colors.LinearSegmentedColormap('my_colormap2',cdict2,256) plt.imshow(a,aspect='auto', cmap =my_cmap2) plt.show() 

EDIT: теперь я понимаю, как работает интерполяция, например, это даст интерполяцию от красного до белого: От белого до красного: переходя по столбцам «матрицы» для каждого цвета, в первом столбце мы имеем xкоординат, где мы хотим, чтобы интерполяция начиналась и заканчивалась, а два других столбца — это фактические значения для значения цвета на этой координате.

cdict2 =

Очевидно, что желаемый градиент будет очень сложно создать путем интерполяции в пространстве RGB.
Dipole 04 сен. 2014, в 17:29
Поделиться

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

mauve 04 сен. 2014, в 15:15
Как вы создали этот пример градиента? Это далеко от линейного.
Mark Ransom 04 сен. 2014, в 18:04

Да, это просто скриншот, иллюстрирующий то, что я хочу. Я не создал это. Мне интересно, есть ли в Python некоторые функции, которые облегчают такие градиенты .

Dipole 04 сен. 2014, в 18:10
Снимок экрана с чего, хотя?
Mark Ransom 04 сен. 2014, в 18:32

Я могу попытаться найти слайд, с которого я его получил, если это поможет, но я просто помню, что он сказал: «Вот пример цветового градиента»

Как создать полупрозрачный градиент?

введите сюда описание изображения

Сейчас мне нужно наложить на back_picture градиент с особыми характеристиками:

  1. Вертикальный
  2. Крайняя нижняя точка имеет цвет #2A303D и 100% непрозрачности
  3. Крайняя верхняя точка имеет цвет #2A303D и 50% непрозрачности
  4. Очень важно! Центр градиента не расположен посередине, т.е. нижняя и верхняя точки неравноправны. Центр градиента смещен в сторону верхней точки, значит, нижняя занимает доминирующее положение. Обозначил точку центра градиента красной стрелкой.

введите сюда описание изображения

Нарисовал картинку, которая показывает разницу наглядно. Цифрой 1 обозначил градиент со смещенным центром(как мне надо), цифрой 2 обозначил градиент без смещенного центра(как мне НЕ надо):

введите сюда описание изображения

Градиент с цифрой 1 является моей целью

Покажу цветом, как градиент может быть смещен в сторону какой-либо точки, чтобы было понятнее. В первом случае градиент смещен в сторону нижней точки, во втором случае — в сторону верхней точки:

введите сюда описание изображения

Работая в illustrator’е я заметил, что png запоминает уровень прозрачности пикселя. Это натолкнуло меня на мысль, что картинку градиента можно просто сохранить и расположить над back_picture .

введите сюда описание изображения

Если открыть эту картинку в каком-нибудь графическом редакторе, полупрозрачные пиксели будут действительно полупрозрачными. Но, к моему большому разочарованию, в окне приложения градиент отображается сплошным квадратом цвета #2A303D:

введите сюда описание изображения

Мне нужно как-то создать градиент с точно такими же характеристиками и расположить его ровно над back_picture (важно, чтобы не было видно стыков), сохранив возможность менять изображение в back_picture . Пожалуйста, помогите мне сделать это

from PyQt5 import QtCore, QtWidgets, QtGui class BackPicture(QtWidgets.QLabel): def __init__(self, picture, x, *args, **kwargs): super(BackPicture, self).__init__(*args, **kwargs) self.setFixedSize(x, x) self.x = x self.setPicture(picture) def setPicture(self, picture): self.setPixmap(QtGui.QPixmap(picture).scaled(self.x, self.x, QtCore.Qt.KeepAspectRatio)) class MyWindow(QtWidgets.QWidget): def __init__(self, parent = None): super().__init__(parent) self.index = 1 btn = QtWidgets.QPushButton('Remake', clicked = self.remake) self.container = QtWidgets.QWidget() self.container.setStyleSheet('background: #2A303D;') self.container.setMinimumHeight(300) self.container.setFixedWidth(300) main_box = QtWidgets.QHBoxLayout(self) main_box.addWidget(btn) main_box.addWidget(self.container) box = QtWidgets.QVBoxLayout(self.container) box.setContentsMargins(0, 0, 0, 0) self.back_picture = BackPicture('picture3.jpg', 300, self.container) self.back_picture.move(0, 0) #self.gradient = BackPicture('gradient.png', 300, self.container) #self.gradient.move(0, 0) НЕ РАБОТАЕТ label = QtWidgets.QLabel('Text number 1') label.setStyleSheet(qss) box.addStretch(6) box.addWidget(label, alignment = QtCore.Qt.AlignCenter) box.addStretch(1) def remake(self): if self.index == 1: self.back_picture.setPicture('picture2.png') self.index = 2 else: self.back_picture.setPicture('picture3.jpg') self.index = 1 qss = '''QLabel < color: white; font: bold 16px; background: transparent; >''' if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.setWindowTitle(' ') window.show() sys.exit(app.exec_()) 

Градиенты в PyCairo [Урок №5]

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

Линейные градиенты

Линейные градиенты являются смесью цветов или цветов теней, отбрасываемых вдоль линии. В PyCairo градиенты представлены классом cairo.LinearGradient .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *