Pregunta

He estado haciendo una imagen reflejada en ejes horizontales y verticales. Ahora voy a hacer la diagonal.

Hice el ancho de hori y verti dos para los bucles que en el escenario de hori recorren todos los píxeles en la altura y solo la mitad de los píxeles en el ancho. Luego obtiene el color del píxel y establece el mismo color al píxel en el otro lado. Pasando del getWidth (pic) al centro.

Luego tengo mi espejo en medio de la foto. ¿Cómo hacer la diagonal?

Editar:

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)
¿Fue útil?

Solución

Si entendí correctamente, lo que necesitas es " voltear " La imagen por una diagonal. Como hay dos de ellos, supongo que te refieres a la que va de la parte inferior izquierda a la superior derecha.

Para pasar esta diagonal, necesitas transformar cada fila del origen en columnas en el destino. La parte izquierda de las filas se convertirá en la parte inferior de las nuevas columnas. También la fila superior se convertirá en la columna más a la derecha. Tendrá que hacer este píxel por píxel en toda la imagen. También tenga en cuenta que el ancho y el alto de la imagen se intercambiarán.

Editar : un pequeño ejemplo. Digamos que empiezas con una imagen de 5 píxeles de ancho y 3 píxeles de alto (5x3). Deberá crear una nueva imagen en blanco de 3 píxeles de ancho y 5 píxeles de alto.

Si inicia la numeración de píxeles desde la esquina superior izquierda con (0,0), este píxel terminará en (2,4) en la nueva imagen, el píxel (1,0) finalizará en (2,3) y así sucesivamente.

Si su ancho y altura originales son W y H, entonces debería usar algo como esto:

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)

Esto debería funcionar, pero no está probado.

Otros consejos

El uso de PIL (la biblioteca de imágenes de Python) es una tarea relativamente sencilla. Sin embargo, tenga en cuenta que la imagen de salida es cuadrada, por lo tanto no es del mismo tamaño que la imagen original.

Aquí está el código:

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')

No es realmente una pregunta de Python, ¿verdad?

La solución más sencilla sería primero reflejar horizontalmente y luego vertical. Otro sería cambiar filas de píxeles con columnas.

O haga su algoritmo, pero cambie los píxeles de la parte superior izquierda a la inferior derecha ...

Aquí es cómo reflejar diagonalmente en JES; Sin embargo, solo funciona para una imagen cuadrada:

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top