# HG changeset patch # User Laman # Date 2017-04-09 16:12:51 # Node ID dde4374cb22ae0a5e2c0bda7cfa805c07ba79eac # Parent 5bf35728ab2bd78f62bc6fce7934be854325b933 imgView: fixed coordinates transformation. fixed onResize glitches diff --git a/src/gui/boardview.py b/src/gui/boardview.py --- a/src/gui/boardview.py +++ b/src/gui/boardview.py @@ -58,3 +58,8 @@ class BoardView(ResizableCanvas): y=r*self._cellHeight+self._padding radius=self._cellWidth/2 self.create_oval(x-radius,y-radius,x+radius,y+radius,tags=tag,fill=hexCode) + + def _onResize(self,event): + super()._onResize(event) + self._cellWidth=(self._width-2*self._padding)/18 + self._cellHeight=(self._height-2*self._padding)/18 diff --git a/src/gui/imgview.py b/src/gui/imgview.py --- a/src/gui/imgview.py +++ b/src/gui/imgview.py @@ -5,6 +5,7 @@ from PIL import ImageTk import config from .resizablecanvas import ResizableCanvas from corners import Corners +from epoint import EPoint from grid import Grid import imageanalyzer @@ -19,7 +20,6 @@ class ImgView(ResizableCanvas): self._img=None self._tkImg=None - self._imgSizeCoef=1 self.configure(width=480,height=360) self.bind('<1>',lambda e: self.addCorner(e.x,e.y)) @@ -54,25 +54,17 @@ class ImgView(ResizableCanvas): self.create_rectangle(r1,c1,r2,c2,outline="#00ffff") def setImg(self,img): - w=int(self._width) - h=int(self._height) - wo,ho=img.size # o for original - widthRatio=wo/w - heightRatio=ho/h - self._imgSizeCoef=max(widthRatio,heightRatio) - self._img=img ## Stores a grid corner located at x,y coordinates. def addCorner(self,x,y): self._corners.add(x,y) log.debug("click on %d,%d",x,y) - log.debug("sizeCoef: %f",self._imgSizeCoef) if self._corners.canonizeOrder(): # transform corners from show coordinates to real coordinates log.debug(self._corners.corners) self._boardGrid=Grid(self._corners.corners) - corners=[(c*self._imgSizeCoef) for c in self._corners.corners] + corners=[self._transformPoint(c) for c in self._corners.corners] self._parent.sendMsg("setCorners",(corners,)) self.redraw() @@ -86,5 +78,17 @@ class ImgView(ResizableCanvas): w=self._width super()._onResize(event) self._corners.scale(self._width/w) - self._boardGrid=Grid(self._corners.corners) + if len(self._corners.corners)==4: + self._boardGrid=Grid(self._corners.corners) self.redraw() + + def _transformPoint(self,point): + w=int(self._width) + h=int(self._height) + wo,ho=self._img.size # o for original + widthRatio=wo/w + heightRatio=ho/h + self._imgSizeCoef=max(widthRatio,heightRatio) + # shift compensates possible horizontal or vertical empty margins from unmatching aspect ratios + self._imgShift=EPoint(wo-w*self._imgSizeCoef,ho-h*self._imgSizeCoef)/2 + return EPoint(self.canvasx(point.x),self.canvasy(point.y)) * self._imgSizeCoef + self._imgShift diff --git a/src/imageanalyzer.py b/src/imageanalyzer.py --- a/src/imageanalyzer.py +++ b/src/imageanalyzer.py @@ -35,7 +35,9 @@ class ImageAnalyzer: for y in range(y1,y2+1): for x in range(x1,x2+1): - red,green,blue=image.getpixel((x,y)) + try: + red,green,blue=image.getpixel((x,y)) + except IndexError: continue I=(red+green+blue)/255/3 m=min(red,green,blue)