2009-09-11 3 views
0

Я делаю зеркальное отражение изображения в горизонтальной и вертикальной осях. Теперь я сделаю диагональ.Зеркальное отражение изображения Python

Я сделал ширину hori и verti шириной два для циклов, которые в сценарии hori пересекают все пиксели высоты и только половину пикселей по ширине. Затем он получает цвет пикселя и устанавливает тот же цвет на пиксель с другой стороны. Переход от getWidth(pic) к центру.

Тогда у меня есть зеркало в середине рисунка. Как сделать диагональный путь?

Edit:

img_src = makePicture(pickAFile()) 
W = getWidth(img_src) 
H = getHeight(img_src) 

for x in range(W): 
     for y in range(H): 
       p = getPixel(img_src, x, y) 
       colorInSrc = getColor(getPixel(img_src, x, y)) 
       destPixel = getPixel(img_src, H-y-1, W-x-1) 
       setColor(destPixel, colorInSrc) 
+0

Это, похоже, не очень вопрос на python, а просто алгоритм управления матрицей. Там нет ничего особенного в языке «как это сделать». Оптимальное решение/алгоритм - это кросс-язык – DrFalk3n

+0

Я не уверен, что делают getPixel и setColor, но похоже, что вы изменяете одно и то же изображение. В моем примере вам нужно создать новое изображение с измененной шириной и высотой (т.высота исходного изображения станет шириной нового изображения) и установите пиксели на новом изображении. Если вы просто хотите сохранить одну и ту же ширину и высоту и изменить один и тот же образ, переходите к тому, что сказал Свен Хехт, и используйте существующий код для вертикальной перемотки, а затем горизонтально на одно и то же изображение. – rslite

ответ

1

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

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

Редактировать: Небольшой пример. Скажем, вы начинаете с изображения 5 пикселей в ширину и 3 пикселя в высоту (5x3). Вам нужно будет создать новое пустое изображение шириной 3 пикселя и высотой 5 пикселей.

Если вы начинаете нумерацию пикселей в левом верхнем углу с помощью (0,0), то этот пиксель будет заканчиваться на (2,4) в новом изображении, пиксель (1,0) заканчивается на (2,3) и так далее.

Если исходная ширина и высота W и H, то вы должны использовать что-то вроде этого:

for x in xrange(W): 
    for y in xrange(H): 
     p = img_src.getpixel(x, y) 
     img_dest.setpixel(H-y-1, W-x-1) 

Это должно работать, но не проверяется.

+0

Я вижу, но я все еще не уверен в том, как должна строиться программа. Мне нужно для петель? для x в диапазоне (0, getWidth (pic): для x в диапазоне (0, getHeight (pic): Тогда как я собираюсь переворачивать пиксели? Это не имеет значения, если у вас есть диафрагма, которая идет от диагонали от верхнего левого до нижнего правого или внизу слева до верхнего правого. – Jafu

+0

Вам нужно новое изображение, в котором можно установить пиксели. – rslite

+0

Спасибо, ive палит мой код сейчас, но не работает. Это из-за отсутствия квадрата Образы? – Jafu

1

Это на самом деле не вопрос Python, это?

Простейшим решением было бы сначала зеркально отобразить горизонтальное, а затем вертикальное. Другим вариантом было бы преобразовать строки пикселей в столбцы.

Или сделать свой алгоритм, но переключать пиксели левого сверху внизу справа ...

+0

quote Свен. Самый простой способ - зеркальное отражение по горизонтали и по вертикали. – DrFalk3n

2

Использование PIL (Python Imaging Library) - это относительно простая задача. Обратите внимание, однако, что выходное изображение квадратное - таким образом, не такое же, как исходное изображение.

Вот код:

from PIL import Image, ImageDraw 

# load the image, create the mirrored image, and the result placeholder 
img = Image.open('img.png') 
mirror = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90) 
sz  = max(img.size + mirror.size) 
result = Image.new(img.mode, (sz,sz)) 
result.paste(img, (0,0)+img.size) 

# now paste the mirrored image, but with a triangular binary mask 
mask = Image.new('1', mirror.size) 
draw = ImageDraw.Draw(mask) 
draw.polygon([0,0,0,sz,sz,sz], outline='white', fill='white') 
result.paste(mirror, (0,0)+mirror.size, mask) 

# clean up and save the result 
del mirror, mask, draw 
result.save('result.png') 
+0

Спасибо, но им только с помощью JES. Его программа для студентов aka noobs ... поэтому ваша версия, вероятно, имеет смысл для других :) – Jafu

0

Вот как зеркало по диагонали в JES; Он работает только для квадратного изображения:

def mirrorDiagonal(picture): 
    for sourceX in range(0,getWidth(picture)): 
    for sourceY in range (0,getHeight(picture)): 
     pex=getPixel(picture,sourceY,sourceX) 
     pix=getPixel(picture, sourceX,sourceY) 
     color=getColor(pix) 
     setColor(pex,color) 
    show(picture) 
+0

Должен также работать и для других форм, как есть. – Michael