Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
不会修仙的道士
labelme
提交
e55ca64a
L
labelme
项目概览
不会修仙的道士
/
labelme
与 Fork 源项目一致
从无法访问的项目Fork
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
labelme
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
e55ca64a
编写于
10月 04, 2011
作者:
M
Michael Pitidis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add support for zooming and make fit optional
Refactor image resizing code in the process.
上级
a2b7a16e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
70 addition
and
19 deletion
+70
-19
labelme.py
labelme.py
+56
-19
zoomwidget.py
zoomwidget.py
+14
-0
未找到文件。
labelme.py
浏览文件 @
e55ca64a
...
...
@@ -12,6 +12,7 @@ from PyQt4.QtGui import *
from
PyQt4.QtCore
import
*
from
canvas
import
Canvas
from
zoomwidget
import
ZoomWidget
__appname__
=
'labelme'
...
...
@@ -74,14 +75,15 @@ class MainWindow(QMainWindow, WindowMixin):
self
.
dock
=
QDockWidget
(
u
'Label'
,
parent
=
self
)
self
.
dock
.
setObjectName
(
u
'Label'
)
self
.
dock
.
setWidget
(
self
.
label
)
self
.
zoom_widget
=
ZoomWidget
()
#self.dock.setFeatures(QDockWidget.DockWidgetMovable|QDockWidget.DockWidgetFloatable)
self
.
imageWidget
=
Canvas
()
self
.
imageWidget
.
setAlignment
(
Qt
.
AlignCenter
)
self
.
imageWidget
.
setContextMenuPolicy
(
Qt
.
ActionsContextMenu
)
self
.
canvas
=
Canvas
()
self
.
canvas
.
setAlignment
(
Qt
.
AlignCenter
)
self
.
canvas
.
setContextMenuPolicy
(
Qt
.
ActionsContextMenu
)
self
.
addDockWidget
(
Qt
.
BottomDockWidgetArea
,
self
.
dock
)
self
.
setCentralWidget
(
self
.
imageWidget
)
self
.
setCentralWidget
(
self
.
canvas
)
# Actions
quit
=
action
(
self
,
'&Quit'
,
self
.
close
,
'Ctrl+Q'
,
u
'Exit application'
)
...
...
@@ -90,8 +92,22 @@ class MainWindow(QMainWindow, WindowMixin):
labl
=
self
.
dock
.
toggleViewAction
()
labl
.
setShortcut
(
'Ctrl+L'
)
add_actions
(
self
.
menu
(
'&File'
),
(
open
,
color
,
None
,
labl
,
None
,
quit
))
add_actions
(
self
.
toolbar
(
'Tools'
),
(
open
,
color
,
None
,
labl
,
None
,
quit
))
zoom
=
QWidgetAction
(
self
)
zoom
.
setDefaultWidget
(
self
.
zoom_widget
)
fit_window
=
action
(
self
,
'&Fit Window'
,
self
.
setFitWindow
,
'Ctrl+F'
,
u
'Fit image to window'
,
checkable
=
True
)
self
.
menus
=
struct
(
file
=
self
.
menu
(
'&File'
),
edit
=
self
.
menu
(
'&Image'
),
view
=
self
.
menu
(
'&View'
))
add_actions
(
self
.
menus
.
file
,
(
open
,
quit
))
add_actions
(
self
.
menus
.
edit
,
(
color
,
fit_window
))
add_actions
(
self
.
menus
.
view
,
(
labl
,))
self
.
tools
=
self
.
toolbar
(
'Tools'
)
add_actions
(
self
.
tools
,
(
open
,
color
,
None
,
zoom
,
fit_window
,
None
,
quit
))
self
.
statusBar
().
showMessage
(
'%s started.'
%
__appname__
)
self
.
statusBar
().
show
()
...
...
@@ -101,6 +117,8 @@ class MainWindow(QMainWindow, WindowMixin):
self
.
filename
=
filename
self
.
recent_files
=
[]
self
.
color
=
None
self
.
zoom_level
=
100
self
.
fit_window
=
False
# TODO: Could be completely declarative.
# Restore application settings.
...
...
@@ -129,6 +147,16 @@ class MainWindow(QMainWindow, WindowMixin):
# Since loading the file may take some time, make sure it runs in the background.
self
.
queueEvent
(
partial
(
self
.
loadFile
,
self
.
filename
))
# Callbacks:
self
.
zoom_widget
.
valueChanged
.
connect
(
self
.
showImage
)
## Callback functions:
def
setFitWindow
(
self
,
value
=
True
):
self
.
zoom_widget
.
setEnabled
(
not
value
)
self
.
fit_window
=
value
self
.
showImage
()
def
queueEvent
(
self
,
function
):
QTimer
.
singleShot
(
0
,
function
)
...
...
@@ -149,22 +177,27 @@ class MainWindow(QMainWindow, WindowMixin):
self
.
showImage
()
self
.
statusBar
().
showMessage
(
message
)
def
showImage
(
self
):
if
self
.
image
.
isNull
():
return
self
.
imageWidget
.
setPixmap
(
self
.
scaled
(
QPixmap
.
fromImage
(
self
.
image
)))
self
.
imageWidget
.
show
()
def
resizeEvent
(
self
,
event
):
if
self
.
imageWidget
and
self
.
imageWidget
.
pixmap
():
self
.
imageWidget
.
setPixmap
(
self
.
scaled
(
self
.
imageWidget
.
pixmap
())
)
if
self
.
fit_window
and
self
.
canvas
and
not
self
.
image
.
isNull
():
self
.
showImage
(
)
super
(
MainWindow
,
self
).
resizeEvent
(
event
)
def
scaled
(
self
,
pixmap
):
width
=
self
.
centralWidget
().
width
()
height
=
self
.
centralWidget
().
height
()
return
pixmap
.
scaled
(
width
,
height
,
Qt
.
KeepAspectRatio
,
Qt
.
SmoothTransformation
)
def
showImage
(
self
):
if
self
.
image
.
isNull
():
return
size
=
self
.
imageSize
()
self
.
canvas
.
setPixmap
(
QPixmap
.
fromImage
(
self
.
image
.
scaled
(
size
,
Qt
.
KeepAspectRatio
,
Qt
.
SmoothTransformation
)))
self
.
canvas
.
show
()
def
imageSize
(
self
):
"""Calculate the size of the image based on current settings."""
if
self
.
fit_window
:
width
,
height
=
self
.
canvas
.
width
(),
self
.
canvas
.
height
()
else
:
# Follow zoom:
s
=
self
.
zoom_widget
.
value
()
/
100.0
width
,
height
=
s
*
self
.
image
.
width
(),
s
*
self
.
image
.
height
()
return
QSize
(
width
,
height
)
def
closeEvent
(
self
,
event
):
# TODO: Make sure changes are saved.
...
...
@@ -227,6 +260,10 @@ class Settings(object):
return
value
class
struct
(
object
):
def
__init__
(
self
,
**
kwargs
):
self
.
__dict__
.
update
(
kwargs
)
def
main
(
argv
):
"""Standard boilerplate Qt application code."""
...
...
zoomwidget.py
0 → 100644
浏览文件 @
e55ca64a
from
PyQt4.QtGui
import
*
from
PyQt4.QtCore
import
*
class
ZoomWidget
(
QSpinBox
):
def
__init__
(
self
,
value
=
100
):
super
(
ZoomWidget
,
self
).
__init__
()
self
.
setButtonSymbols
(
QAbstractSpinBox
.
PlusMinus
)
self
.
setRange
(
1
,
500
)
self
.
setSuffix
(
' %'
)
self
.
setValue
(
value
)
self
.
setToolTip
(
u
'Image zoom'
)
self
.
setStatusTip
(
self
.
toolTip
())
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录