Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. from Tkinter import *
  2. import Image, ImageTk
  3.  
  4. class GUI:
  5. def __init__(self,root):
  6. frame = Frame(root, bd=2, relief=SUNKEN)
  7.  
  8. frame.grid_rowconfigure(0, weight=1)
  9. frame.grid_columnconfigure(0, weight=1)
  10. xscrollbar = Scrollbar(frame, orient=HORIZONTAL)
  11. xscrollbar.grid(row=1, column=0, sticky=E+W)
  12. yscrollbar = Scrollbar(frame)
  13. yscrollbar.grid(row=0, column=1, sticky=N+S)
  14. self.canvas = Canvas(frame, bd=0, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set, xscrollincrement = 10, yscrollincrement = 10)
  15. self.canvas.grid(row=0, column=0, sticky=N+S+E+W)
  16.  
  17. File = "PATH TO JPG PICTURE HERE"
  18.  
  19. self.img = ImageTk.PhotoImage(Image.open(File))
  20. self.canvas.create_image(0,0,image=self.img, anchor="nw")
  21. self.canvas.config(scrollregion=self.canvas.bbox(ALL))
  22. xscrollbar.config(command=self.canvas.xview)
  23. yscrollbar.config(command=self.canvas.yview)
  24.  
  25. frame.pack()
  26.  
  27. self.canvas.bind("<Button 3>",self.grab)
  28. self.canvas.bind("<B3-Motion>",self.drag)
  29. root.bind("<MouseWheel>",self.zoom)
  30.  
  31.  
  32. def grab(self,event):
  33. self._y = event.y
  34. self._x = event.x
  35.  
  36. def drag(self,event):
  37. if (self._y-event.y < 0): self.canvas.yview("scroll",-1,"units")
  38. elif (self._y-event.y > 0): self.canvas.yview("scroll",1,"units")
  39. if (self._x-event.x < 0): self.canvas.xview("scroll",-1,"units")
  40. elif (self._x-event.x > 0): self.canvas.xview("scroll",1,"units")
  41. self._x = event.x
  42. self._y = event.y
  43.  
  44. def zoom(self,event):
  45. if event.delta>0: print "ZOOM IN!"
  46. elif event.delta<0: print "ZOOM OUT!"
  47.  
  48.  
  49. root = Tk()
  50. GUI(root)
  51. root.mainloop()
  52.  
  53. class GUI:
  54. def __init__(self, root):
  55.  
  56. # ... omitted rest of initialization code
  57.  
  58. self.canvas.config(scrollregion=self.canvas.bbox(ALL))
  59. self.scale = 1.0
  60. self.orig_img = Image.open(File)
  61. self.img = None
  62. self.img_id = None
  63. # draw the initial image at 1x scale
  64. self.redraw()
  65.  
  66. # ... rest of init, bind buttons, pack frame
  67.  
  68. def zoom(self,event):
  69. if event.num == 4:
  70. self.scale *= 2
  71. elif event.num == 5:
  72. self.scale *= 0.5
  73. self.redraw(event.x, event.y)
  74.  
  75. def redraw(self, x=0, y=0):
  76. if self.img_id:
  77. self.canvas.delete(self.img_id)
  78. iw, ih = self.orig_img.size
  79. size = int(iw * self.scale), int(ih * self.scale)
  80. self.img = ImageTk.PhotoImage(self.orig_img.resize(size))
  81. self.img_id = self.canvas.create_image(x, y, image=self.img)
  82.  
  83. # tell the canvas to scale up/down the vector objects as well
  84. self.canvas.scale(ALL, x, y, self.scale, self.scale)
  85.  
  86. 1x (500, 375) 14 M
  87. 2x (1000, 750) 19 M
  88. 4x (2000, 1500) 42 M
  89. 8x (4000, 3000) 181 M
  90. 16x (8000, 6000) 640 M
  91. 32x (16000, 12000) 1606 M
  92. 64x (32000, 24000) ...
  93. reached around ~7400 M and ran out of memory, EXC_BAD_ACCESS in _memcpy
  94.  
  95. def redraw(self, x=0, y=0):
  96. if self.img_id: self.canvas.delete(self.img_id)
  97. iw, ih = self.orig_img.size
  98. # calculate crop rect
  99. cw, ch = iw / self.scale, ih / self.scale
  100. if cw > iw or ch > ih:
  101. cw = iw
  102. ch = ih
  103. # crop it
  104. _x = int(iw/2 - cw/2)
  105. _y = int(ih/2 - ch/2)
  106. tmp = self.orig_img.crop((_x, _y, _x + int(cw), _y + int(ch)))
  107. size = int(cw * self.scale), int(ch * self.scale)
  108. # draw
  109. self.img = ImageTk.PhotoImage(tmp.resize(size))
  110. self.img_id = self.canvas.create_image(x, y, image=self.img)
  111. gc.collect()
  112.  
  113. from Tkinter import *
  114. import Image, ImageTk
  115.  
  116. class LoadImage:
  117. def __init__(self,root):
  118. frame = Frame(root)
  119. self.canvas = Canvas(frame,width=900,height=900)
  120. self.canvas.pack()
  121. frame.pack()
  122. File = "INSERT JPG FILE PATH"
  123. self.orig_img = Image.open(File)
  124. self.img = ImageTk.PhotoImage(self.orig_img)
  125. self.canvas.create_image(0,0,image=self.img, anchor="nw")
  126.  
  127. self.zoomcycle = 0
  128. self.zimg_id = None
  129.  
  130. root.bind("<MouseWheel>",self.zoomer)
  131. self.canvas.bind("<Motion>",self.crop)
  132.  
  133. def zoomer(self,event):
  134. if (event.delta > 0):
  135. if self.zoomcycle != 4: self.zoomcycle += 1
  136. elif (event.delta < 0):
  137. if self.zoomcycle != 0: self.zoomcycle -= 1
  138. self.crop(event)
  139.  
  140. def crop(self,event):
  141. if self.zimg_id: self.canvas.delete(self.zimg_id)
  142. if (self.zoomcycle) != 0:
  143. x,y = event.x, event.y
  144. if self.zoomcycle == 1:
  145. tmp = self.orig_img.crop((x-45,y-30,x+45,y+30))
  146. elif self.zoomcycle == 2:
  147. tmp = self.orig_img.crop((x-30,y-20,x+30,y+20))
  148. elif self.zoomcycle == 3:
  149. tmp = self.orig_img.crop((x-15,y-10,x+15,y+10))
  150. elif self.zoomcycle == 4:
  151. tmp = self.orig_img.crop((x-6,y-4,x+6,y+4))
  152. size = 300,200
  153. self.zimg = ImageTk.PhotoImage(tmp.resize(size))
  154. self.zimg_id = self.canvas.create_image(event.x,event.y,image=self.zimg)
  155.  
  156. if __name__ == '__main__':
  157. root = Tk()
  158. root.title("Crop Test")
  159. App = LoadImage(root)
  160. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement