Question

Je réalise une image en miroir sur les axes horizontal et vertical. Maintenant, je vais faire la diagonale.

J'avais fait l'hori et le verti width deux pour les boucles qui, dans le scénario hori, parcouraient tous les pixels de la hauteur et seulement la moitié des pixels de la largeur. Ensuite, il obtient la couleur du pixel et définit la même couleur sur le pixel de l'autre côté. Aller du getWidth (pic) au centre.

Ensuite, j'ai mon miroir au milieu de la photo. Comment faire en diagonale?

Modifier:

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)
Était-ce utile?

La solution

Si j'ai bien compris, vous devez "retourner". l'image par une diagonale. Comme il y en a deux, je présume que vous voulez parler de celui qui va de gauche en bas à droite en haut.

Pour inverser cette diagonale, vous devez transformer chaque ligne de la source en colonnes de la destination. La partie gauche des lignes deviendra la partie inférieure des nouvelles colonnes. De plus, la rangée la plus haute deviendra la colonne la plus à droite. Vous devrez le faire pixel par pixel sur l’ensemble de l’image. N'oubliez pas non plus que la largeur et la hauteur de l'image seront échangées.

Modifier : petit exemple. Supposons que vous commenciez avec une image de 5 pixels de large et 3 pixels de haut (5x3). Vous devrez créer une nouvelle image vierge de 3 pixels de large et 5 pixels de haut.

Si vous commencez la numérotation des pixels à partir du coin supérieur gauche avec (0,0), ce pixel se retrouvera à (2,4) dans la nouvelle image, le pixel (1,0) se terminera à (2,3). et ainsi de suite.

Si votre largeur et votre hauteur d'origine sont W et H, vous devriez utiliser quelque chose comme ceci:

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)

Cela devrait fonctionner, mais n'est pas testé.

Autres conseils

L'utilisation de PIL (la bibliothèque d'imagerie Python) est une tâche relativement simple. Notez cependant que l’image de sortie est carrée, donc pas de la même taille que l’image originale.

Voici le code:

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

Ce n'est pas vraiment une question Python, n'est-ce pas?

La solution la plus simple serait de commencer par faire un miroir horizontal puis vertical. Une autre solution consisterait à changer de rangée de pixels avec des colonnes.

Ou utilisez votre algorithme, mais changez les pixels de gauche en haut à droite ...

Voici comment créer un miroir en diagonale dans JES. Cela ne fonctionne que pour une image carrée:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top