원본 이미지의 컬러 값은 윈도우 사이즈/화상 사이즈에 대해서 배열
image[x][y]
이어서 확대 된 이미지의 컬러 값은
image[x+zf*(px-x)][y+zf*(py-y)]
로 주어지면 -주의해야 화상의 초기 준비 창에 더 이상 맞지 않는 지점까지 이미지를 확대하고 나머지 픽셀을 원하는 배경색으로 채 웁니다. 파이썬에서
당신이
import Image
편집에서 개체와
im = Image.open("filename.ext")
을 설정 한 후
def naivezoom(im, px, py, zf, bg):
out = Image.new(im.mode, im.size)
pix = out.load()
iw, ih = im.size
for x in range(iw):
for y in range(ih):
xorg = x + zf*(px - x)
yorg = y + zf*(py - y)
if xorg >= 0 and xorg < iw and yorg >= 0 and yorg < ih:
pix[x,y] = im.getpixel((xorg , yorg))
else:
pix[x,y] = bg
return out
처럼 뭔가를 할 수 있습니다 감안할 때 유래 로고 당신은 얻을 것이다
,691
이미지 코드 다음
#!/bin/env python
from Tkinter import *
import Image
import ImageTk
def naivezoom(im, p, zf, bg):
out = Image.new(im.mode, im.size)
pix = out.load()
iw, ih = im.size
for x in range(iw):
for y in range(ih):
xorg = x + zf*(p[0] - x)
yorg = y + zf*(p[1] - y)
if xorg >= 0 and xorg < iw and yorg >= 0 and yorg < ih:
pix[x,y] = im.getpixel((xorg , yorg))
else:
pix[x,y] = bg
return out
class NaiveTkZoom:
def __init__(self, parent=None):
root = Tk()
self.im = Image.open('logo.jpg')
self.zf = 0.0
self.deltazf = 0.02
self.p = (0.1*self.im.size[0],0.1*self.im.size[1])
self.bg = 255
canvas = Canvas(root, width=self.im.size[0]+20 , height=self.im.size[1]+20)
canvas.pack()
root.bind('<Key>', self.onKey)
self.canvas = canvas
self.photo = ImageTk.PhotoImage(self.im)
self.item = self.canvas.create_image(10, 10, anchor=NW, image=self.photo)
def onKey(self, event):
if event.char == "+":
if self.zf < 1:
self.zf += self.deltazf
elif event.char == "-":
if self.zf > 0:
self.zf -= self.deltazf
self.out = naivezoom(self.im, self.p, self.zf, self.bg)
self.photo = ImageTk.PhotoImage(self.out)
self.canvas.delete(self.item)
self.item = self.canvas.create_image(10, 10, anchor=NW, image=self.photo)
print self.p, self.zf
if __name__ == "__main__":
NaiveTkZoom()
mainloop()
얻어졌다 동일한 지점 주위 ZF = 0.96 대 25,6
alt text http://i41.tinypic.com/24g5848.png
지점 주위 ZF = 0.3 대 363,210
alt text http://i40.tinypic.com/i1cwg7.jpg
,
사용되는 라이브러리와 픽셀 별 접근 방식은 세계에서 가장 빠르지 않지만 g 당신과 함께 놀 수있는 충분한 재료를 줘보십시오.
위의 코드는 매우 깨끗하지 않습니다.
EDIT2 (and3, 공식을 중심으로 함) : 다른 시도가 있는데 번역이 추가되었지만 이것이 최종적인 것이 아니라고 생각합니다. (수식을 확인할 시간이 없습니다). 또한 번역 속도가 일정하지만 속도가 느려지 고 배경이 표시 될 수 있습니다 (확대 점이 가장자리에 너무 가까울 경우).
원본 이미지에 페인트 할 필요없이 원본 이미지의 점을 볼 수 있도록 원래 이미지에 점을 추가했습니다.
#!/bin/env python
from Tkinter import *
import Image
import ImageTk
def markImage(im, p, bg):
pix = im.load()
pix[ p[0], p[1] ] = bg
def naiveZoom(im, p, zf, bg):
out = Image.new(im.mode, im.size)
pix = out.load()
iw, ih = im.size
for x in range(iw):
for y in range(ih):
xorg = x + zf*(p[0]+0.5-x) + zf*(1-zf)*(p[0]-iw/2)
yorg = y + zf*(p[1]+0.5-y) + zf*(1-zf)*(p[1]-ih/2)
if xorg >= 0 and xorg < iw and yorg >= 0 and yorg < ih:
pix[x,y] = im.getpixel((xorg , yorg))
else:
pix[x,y] = bg
return out
class NaiveTkZoom:
def __init__(self, parent=None):
root = Tk()
self.im = Image.open('py.jpg')
self.zf = 0.0
self.deltazf = 0.05
self.p = (round(0.3*self.im.size[0]), round(0.3*self.im.size[1]))
self.bg = 255
markImage(self.im, self.p, self.bg)
canvas = Canvas(root, width=self.im.size[0]+20 , height=self.im.size[1]+20)
canvas.pack()
root.bind('<Key>', self.onKey)
self.canvas = canvas
self.photo = ImageTk.PhotoImage(self.im)
self.item = self.canvas.create_image(10, 10, anchor=NW, image=self.photo)
self.change = False
def onKey(self, event):
if event.char == "+":
if self.zf < 1:
self.zf += self.deltazf
self.change = True
elif event.char == "-":
if self.zf > 0:
self.zf -= self.deltazf
self.change = True
if self.change:
self.out = naiveZoom(self.im, self.p, self.zf, self.bg)
self.photo = ImageTk.PhotoImage(self.out)
self.canvas.delete(self.item)
self.change = False
self.item = self.canvas.create_image(10, 10, anchor=NW, image=self.photo)
print self.p, self.zf
if __name__ == "__main__":
NaiveTkZoom()
mainloop()
개선 할 수있는 항목이 상당히 많습니다. :)
일련의 확대/축소 수준을 통해 최종 이미지 또는 애니메이션을 원한다면 먼저 명확히 할 수 있습니까? 애니메이션이 필요한 경우 최대 및 최소 줌 레벨 (0 및 1)을 설명 할 필요가있을뿐만 아니라 카메라가 이동하는 속도가 선형인지 아닌지 (선형이 약간 부자연스럽고 가속되어 즉시 멈 춥니 다). 또한 카메라가 확대/축소되는 픽셀은 일반적으로 중앙에 있지 않으므로 확대/축소가 진행되는 것이 아니라 카메라를 번역하여 픽셀을 넘기는 것입니다. 이것은 선형이라고 가정 할 수 있지만 확인은 좋을 것입니다. – Unreason
메모 - 알고리즘은 간단하지만 기존 라이브러리를 더 똑똑하게 사용하여 호출하는 것이 좋습니다. – Unreason
주어진 줌 요소에 대해 나는 단지 하나의 이미지 프레임만을 원한다. 그 다음에는 줌 요소 0에서 1까지 단계별로 애니메이션을 만듭니다. 속도는 정의하기가 더 어렵습니다. 고정 된 단계로 0에서 1 줌 배율로 이동하면 픽셀에 대해 "자연스러운"모션을 찾고 있습니다 (고정 할 필요는 없지만 훌륭합니다). 또한 기존 라이브러리를 사용해도 괜찮습니다. – zaf