Frage

Ich habe ein Bild machen worden in horizontalen und vertikalen Achse spiegeln. Jetzt werde ich die Diagonale machen.

hatte ich die hori getan und Breite zwei for-Schleifen Verti, die in dem hori Szenario all Pixel in der Höhe durchlaufen und nur die Hälfte der Pixel in der Breite. Dann wird es die Farbe des Pixels und stellen Sie die gleiche Farbe auf das Pixel auf der anderen Seite. Wenn man von den getWidth(pic) ins Zentrum.

Dann habe ich meinen Spiegel in der Mitte des pic. Wie die diagonale Weise zu tun?

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)
War es hilfreich?

Lösung

Wenn ich das richtig verstanden, was Sie brauchen, ist zu „Flip“, um das Bild durch eine Diagonale. Da es zwei von ihnen sind werde ich nehme an, dass Sie die eine bedeuten, die nach rechts oben von links unten geht.

Um von dieser Diagonalen Sie jede Zeile von der Quelle in den Spalten in der Ziel zu transformieren müssen kippen. Der linke Teil der Reihen wird der untere Teil der neuen Spalten werden. Auch die oberste Zeile wird die Spalte ganz rechts werden. Sie müssen diese Pixel für Pixel auf das gesamte Bild zu tun. Denken Sie auch daran, dass die Breite und Höhe des Bildes vertauscht werden.

Bearbeiten : Ein kleines Beispiel. Sagen Sie bitte mit einem Bild 5 Pixel breit und 3 Pixel hoch (5x3) starten. Sie werden ein neues leeres Bild 3 Pixel breit und 5 Pixel hoch erstellen müssen.

Wenn Sie Pixel Nummerierung von links oberer Ecke mit (0,0) beginnen, dann wird dieses Pixel bei (2,4) am Ende in dem neuen Bild, Pixel (1,0) wird am Ende (2,3) und so weiter.

Wenn Sie Ihre ursprüngliche Breite und Höhe sind W und H dann sollten Sie etwas wie folgt verwendet werden:

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)

Das sollte funktionieren, ist aber nicht getestet.

Andere Tipps

Mit PIL (der Python Imaging Library) ist dies eine relativ einfache Aufgabe. Beachten Sie jedoch, dass das Ausgangsbild ist quadratisch -. Also nicht die gleiche Größe wie das Originalbild

Hier ist der 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')

Es ist nicht wirklich eine Python Frage, oder?

Die einfachste Lösung zum ersten Spiegel wäre horizontal und dann vertikal. Eine andere wäre, Pixelzeilen mit Spalten zu wechseln.

oder Ihren Algorithmus zu tun, aber die Pixel von links oben nach rechts unten wechseln ...

Hier ist, wie diagonal in JES spiegeln; Es funktioniert nur für ein quadratisches Bild, wenn:

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top