16:54 Изменяем изображения посредством пикселей. |
Урок 5 Анализируем пикселиматериал взят с сайта kostyalamer.narod.ru Понятие surface - поверхность, это некоторое виртуальное окно ( в отличие от screen, который всегда один, поверхностей может быть много ), с которым можно производить различные действия, а можно и загрузить ее в screen: screen.blit(surface,(0,0)) для последующего отображения на дисплее оператором pigame.display.flip().
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# без этой строки нельзя пользоваться русским даже в коментариях
import os, pygame
#подключить модули os и pygame
pygame.init ()
#обязательно при работе pygame
screen = pygame.display.set_mode ((255, 255))
#задать размер окна x , y
surface = pygame.Surface ((255, 255))
#задать размер виртуальной поверхности x , y
pygame.display.flip ()
# показать изменение на экране, внимание без использования этого
# оператора на экране останется старая картинка
def show (image):
# процедура заливает окно ,белым цветом и в координаты 0,0 впечатывает
# картинку после чего ожидает клика мышкой в окне программы для
# выхода из процедуры
# или щелчка по кнопке закрытия,крест, на заголовке окна, для
# выхода из программы
screen.fill ((255, 255, 255))
# заливка цветом
screen.blit (image, (0, 0))
# загрузка изображения
pygame.display.flip ()
# отрисовка на всего на экране
while 1:
# бесконечный цикл
event = pygame.event.wait ()
if event.type == pygame.QUIT:
raise SystemExit
# выход из программы по нажатию Esc или попытки закрытия окна
if event.type == pygame.MOUSEBUTTONDOWN:
break
# выход из процедуры по щелчку мыши на окне программы
# Create the PixelArray.
#---------------------------------------------------------
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
r, g, b = 0, 0, 0
# Do some easy gradient effect.
# верикальный градиент,темное вверху
for y in xrange (255):
# значения цвета в каждом канале red,green,blue одновременно изменяются
# в цикле от 0 до 255 это переход от черного к белому
r, g, b = y, y, y
ar[:,y] = (r, g, b)
# нумерация строк массива тоже изменяется в цикле от 0 до 255 при этом
# во все элементы строки записывается текущее значение цвета
del ar
# необходимо сделать чтобы изменения в массиве привели к изменению
# картинки, внимание массив при этом удаляется
show (surface)
#---------------------------------------------------------
# We have made some gradient effect, now flip it.
# вертикальный градиент ,темное внизу
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:] = ar[:,::-1]
# Переворачиваем массив по Y '(каждой строчке массива начиная с первой Ymin+1 ar[:]
# присваиваем значение строчки начиная с последней Ymax-1 ar[:,::-1) '
del ar
show (surface)
#---------------------------------------------------------
# Every second column will be made blue
# вертикальные синие полосы
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[::2] = (0, 0, 255)
# во все столбцы через 2 записываем синий для любого значения Y'(цвет задается
# в формате красный,зеленый,синий интенсивность от 0 до 255 )'
del ar
show (surface)
#---------------------------------------------------------
# Every second row will be made green
# Зеленые квадратики
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:,::2] = (0, 255, 0)
# Во все строки через 2 записываем зеленый для любого значения X
del ar
show (surface)
#---------------------------------------------------------
# Manipulate the image. Flip it around the y axis.
# Перевернуть изобр по Y
surface = pygame.image.load (os.path.join ('data', 'arraydemo.bmp'))
# загрузить изображение arraydemo.bmp из каталога data на поверхность
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:] = ar[:,::-1]
# Переворачиваем массив по Y '(каждой строчке массива начиная с первой Ymin+1 ar[:]
# присваиваем значение строчки начиная с последней Ymax-1 ar[:,::-1]) '
del ar
show (surface)
#---------------------------------------------------------
# Flip the image around the x axis.
# Перевернуть изображение по X
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:] = ar[::-1,:]
# Переворачиваем массив по X '(каждой столбцу массива начиная с первого Xmin+1 ar[:]
# присваиваем значение столбца начиная с последнего Xmax-1 ar[::-1,:]) '
del ar
show (surface)
#---------------------------------------------------------
# Every second column will be made white.
# Провести белые вертикальные прямые с промежутком 2 пиксела
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[::2] = (255, 255, 255)
del ar
show (surface)
#----------------------------------------------------------
# Flip the image around both axes, restoring it's original layout.
# Перевернуть изображение по X и по Y - исходная картинка
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:] = ar[::-1,::-1]
del ar
show (surface)
#----------------------------------------------------------
# Scale it by throwing each second pixel away.
# Уменьшить изображение в 2 раза
surface = pygame.image.load (os.path.join ('data', 'arraydemo.bmp'))
# загружаем изображение
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
sf2 = ar[::2,::2].make_surface ()
# Создаем новую поверхность выбирая точки через одну по X и Y
del ar
show (sf2)
# Рисуем на экране новую поверхность
#-----------------------------------------------------------
# Replace anything looking like the blue color from the text.
# Заменить цвет
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar.replace ((60, 60, 255), (0, 255, 0), 0.06)
# Заменяем пикселы совпадающие по цвету из первых скобок на цвет из вторых
# скобок коэффициент изменяется от 0 до 1 и является порогом цвета
del ar
show (surface)
#-----------------------------------------------------------
# Extract anything which might be somewhat black.
# Заменить цвет на черный
surface = pygame.image.load (os.path.join ('data', 'arraydemo.bmp'))
# Грузим картинку
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar2 = ar.extract ((0, 0, 0), 0.07)
# Создаем массив ar2 из массива ar заменяя его точки на черные, коэффициент
# порога цвета 0.07
sf2 = ar2.surface
# создаем поверхность из массива
del ar, ar2
show (sf2)
# Рисуем на экране новую поверхность
#-----------------------------------------------------------
# Compare two images.
# Сравнить 2 изображения, несовпадающие элементы белым
surface = pygame.image.load (os.path.join ('data', 'alien1.gif'))
# грузим 1-ую картинку
surface2 = pygame.image.load (os.path.join ('data', 'alien2.gif'))
# грузим 2-ую картинку
ar1 = pygame.PixelArray (surface)
ar2 = pygame.PixelArray (surface2)
# создаем массивы соответствующие поверхностям
ar3 = ar1.compare (ar2, 0.07)
# создаем массив ar3 сравнивая ar1 и ar2, если элементы совпадают,с учетом
# коэффициента, ставим черный пиксел, если нет белый
sf3 = ar3.surface
# создаем новую поверхность соответствующую массиву
del ar1, ar2, ar3
show (sf3)
# Рисуем на экране новую поверхность
3. Моя демка:
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# небольшая демка на тему pygame.PixelArray
import os, pygame
katalog = 'cosmos'
risunok = 'whirlpool.jpg'
pygame.init ()
xs=800
ys=500
screen = pygame.display.set_mode ((xs, ys))
# задаем размер окна
pygame.display.flip ()
# отрисовываем его на дисплее
def show (image):
# процедура заливает окно ,белым цветом и в координаты 0,0 впечатывает
# картинку, после чего ждет 1 секунду
screen.fill ((255, 255, 255))
# заливка цветом
screen.blit (image, (0, 0))
# загрузка изображения
pygame.display.flip ()
pygame.time.wait(1000)
#-----------------------------------------------------------------
surface = pygame.image.load (os.path.join (katalog, risunok))
# Грузим изображение на поверхность
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[::16,:] = [0,255,0] # вертик зеленые полосы Y
ar[:,::16 ] = [0,255,0] # гориз зеленые полосы X
for i in range (ys):
ar[i,i] = [0,0,255] # проводим красную диагональ
del ar
show (surface)
#-----------------------------------------------------------------
# заливка синим цветом
surface = pygame.image.load (os.path.join (katalog, risunok))
# грузим рисунок на поверхность
ar = pygame.PixelArray (surface)
# Создаем 2-мерный массив ar соответствующий поверхности
ar[:,:] = [255,0,0]
# Во все точки массива записываем синий
del ar
show (surface)
|
|
Всего комментариев: 0 | |