parent
861fbe9a2b
commit
e2d758f540
47
labelImg.py
47
labelImg.py
@ -34,6 +34,7 @@ from libs.shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR
|
||||
from libs.stringBundle import StringBundle
|
||||
from libs.canvas import Canvas
|
||||
from libs.zoomWidget import ZoomWidget
|
||||
from libs.lightWidget import LightWidget
|
||||
from libs.labelDialog import LabelDialog
|
||||
from libs.colorDialog import ColorDialog
|
||||
from libs.labelFile import LabelFile, LabelFileError, LabelFileFormat
|
||||
@ -180,10 +181,12 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
self.file_dock.setWidget(file_list_container)
|
||||
|
||||
self.zoom_widget = ZoomWidget()
|
||||
self.light_widget = LightWidget(get_str('lightWidgetTitle'))
|
||||
self.color_dialog = ColorDialog(parent=self)
|
||||
|
||||
self.canvas = Canvas(parent=self)
|
||||
self.canvas.zoomRequest.connect(self.zoom_request)
|
||||
self.canvas.lightRequest.connect(self.light_request)
|
||||
self.canvas.set_drawing_shape_to_square(settings.get(SETTING_DRAW_SQUARE, False))
|
||||
|
||||
scroll = QScrollArea()
|
||||
@ -326,6 +329,26 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
self.MANUAL_ZOOM: lambda: 1,
|
||||
}
|
||||
|
||||
light = QWidgetAction(self)
|
||||
light.setDefaultWidget(self.light_widget)
|
||||
self.light_widget.setWhatsThis(
|
||||
u"Brighten or darken current image. Also accessible with"
|
||||
" %s and %s from the canvas." % (format_shortcut("Ctrl+Shift+[-+]"),
|
||||
format_shortcut("Ctrl+Shift+Wheel")))
|
||||
self.light_widget.setEnabled(False)
|
||||
|
||||
light_brighten = action(get_str('lightbrighten'), partial(self.add_light, 10),
|
||||
'Ctrl+Shift++', 'light_lighten', get_str('lightbrightenDetail'), enabled=False)
|
||||
light_darken = action(get_str('lightdarken'), partial(self.add_light, -10),
|
||||
'Ctrl+Shift+-', 'light_darken', get_str('lightdarkenDetail'), enabled=False)
|
||||
light_org = action(get_str('lightreset'), partial(self.set_light, 50),
|
||||
'Ctrl+Shift+=', 'light_reset', get_str('lightresetDetail'), checkable=True, enabled=False)
|
||||
light_org.setChecked(True)
|
||||
|
||||
# Group light controls into a list for easier toggling.
|
||||
light_actions = (self.light_widget, light_brighten,
|
||||
light_darken, light_org)
|
||||
|
||||
edit = action(get_str('editLabel'), self.edit_label,
|
||||
'Ctrl+E', 'edit', get_str('editLabelDetail'),
|
||||
enabled=False)
|
||||
@ -364,6 +387,8 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
zoom=zoom, zoomIn=zoom_in, zoomOut=zoom_out, zoomOrg=zoom_org,
|
||||
fitWindow=fit_window, fitWidth=fit_width,
|
||||
zoomActions=zoom_actions,
|
||||
lightBrighten=light_brighten, lightDarken=light_darken, lightOrg=light_org,
|
||||
lightActions=light_actions,
|
||||
fileMenuActions=(
|
||||
open, open_dir, save, save_as, close, reset_all, quit),
|
||||
beginner=(), advanced=(),
|
||||
@ -411,7 +436,8 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
labels, advanced_mode, None,
|
||||
hide_all, show_all, None,
|
||||
zoom_in, zoom_out, zoom_org, None,
|
||||
fit_window, fit_width))
|
||||
fit_window, fit_width, None,
|
||||
light_brighten, light_darken, light_org))
|
||||
|
||||
self.menus.file.aboutToShow.connect(self.update_file_menu)
|
||||
|
||||
@ -424,7 +450,8 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
self.tools = self.toolbar('Tools')
|
||||
self.actions.beginner = (
|
||||
open, open_dir, change_save_dir, open_next_image, open_prev_image, verify, save, save_format, None, create, copy, delete, None,
|
||||
zoom_in, zoom, zoom_out, fit_window, fit_width)
|
||||
zoom_in, zoom, zoom_out, fit_window, fit_width, None,
|
||||
light_brighten, light, light_darken, light_org)
|
||||
|
||||
self.actions.advanced = (
|
||||
open, open_dir, change_save_dir, open_next_image, open_prev_image, save, save_format, None,
|
||||
@ -500,6 +527,7 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
|
||||
# Callbacks:
|
||||
self.zoom_widget.valueChanged.connect(self.paint_canvas)
|
||||
self.light_widget.valueChanged.connect(self.paint_canvas)
|
||||
|
||||
self.populate_mode_actions()
|
||||
|
||||
@ -601,6 +629,8 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
"""Enable/Disable widgets which depend on an opened image."""
|
||||
for z in self.actions.zoomActions:
|
||||
z.setEnabled(value)
|
||||
for z in self.actions.lightActions:
|
||||
z.setEnabled(value)
|
||||
for action in self.actions.onLoadActive:
|
||||
action.setEnabled(value)
|
||||
|
||||
@ -1032,6 +1062,9 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
h_bar.setValue(new_h_bar_value)
|
||||
v_bar.setValue(new_v_bar_value)
|
||||
|
||||
def light_request(self, delta):
|
||||
self.add_light(5*delta // (8 * 15))
|
||||
|
||||
def set_fit_window(self, value=True):
|
||||
if value:
|
||||
self.actions.fitWidth.setChecked(False)
|
||||
@ -1044,6 +1077,15 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
self.zoom_mode = self.FIT_WIDTH if value else self.MANUAL_ZOOM
|
||||
self.adjust_scale()
|
||||
|
||||
def set_light(self, value):
|
||||
self.actions.lightOrg.setChecked(int(value) == 50)
|
||||
# Arithmetic on scaling factor often results in float
|
||||
# Convert to int to avoid type errors
|
||||
self.light_widget.setValue(int(value))
|
||||
|
||||
def add_light(self, increment=10):
|
||||
self.set_light(self.light_widget.value() + increment)
|
||||
|
||||
def toggle_polygons(self, value):
|
||||
for item, shape in self.items_to_shapes.items():
|
||||
item.setCheckState(Qt.Checked if value else Qt.Unchecked)
|
||||
@ -1172,6 +1214,7 @@ class MainWindow(QMainWindow, WindowMixin):
|
||||
def paint_canvas(self):
|
||||
assert not self.image.isNull(), "cannot paint null image"
|
||||
self.canvas.scale = 0.01 * self.zoom_widget.value()
|
||||
self.canvas.overlay_color = self.light_widget.color()
|
||||
self.canvas.label_font_size = int(0.02 * max(self.image.width(), self.image.height()))
|
||||
self.canvas.adjustSize()
|
||||
self.canvas.update()
|
||||
|
||||
@ -23,6 +23,7 @@ CURSOR_GRAB = Qt.OpenHandCursor
|
||||
|
||||
class Canvas(QWidget):
|
||||
zoomRequest = pyqtSignal(int)
|
||||
lightRequest = pyqtSignal(int)
|
||||
scrollRequest = pyqtSignal(int, int)
|
||||
newShape = pyqtSignal()
|
||||
selectionChanged = pyqtSignal(bool)
|
||||
@ -47,6 +48,7 @@ class Canvas(QWidget):
|
||||
self.prev_point = QPointF()
|
||||
self.offsets = QPointF(), QPointF()
|
||||
self.scale = 1.0
|
||||
self.overlay_color = None
|
||||
self.label_font_size = 8
|
||||
self.pixmap = QPixmap()
|
||||
self.visible = {}
|
||||
@ -503,7 +505,15 @@ class Canvas(QWidget):
|
||||
p.scale(self.scale, self.scale)
|
||||
p.translate(self.offset_to_center())
|
||||
|
||||
p.drawPixmap(0, 0, self.pixmap)
|
||||
temp = self.pixmap
|
||||
if self.overlay_color:
|
||||
temp = QPixmap(self.pixmap)
|
||||
painter = QPainter(temp)
|
||||
painter.setCompositionMode(painter.CompositionMode_Overlay)
|
||||
painter.fillRect(temp.rect(), self.overlay_color)
|
||||
painter.end()
|
||||
|
||||
p.drawPixmap(0, 0, temp)
|
||||
Shape.scale = self.scale
|
||||
Shape.label_font_size = self.label_font_size
|
||||
for shape in self.shapes:
|
||||
@ -607,7 +617,9 @@ class Canvas(QWidget):
|
||||
v_delta = delta.y()
|
||||
|
||||
mods = ev.modifiers()
|
||||
if Qt.ControlModifier == int(mods) and v_delta:
|
||||
if int(Qt.ControlModifier) | int(Qt.ShiftModifier) == int(mods) and v_delta:
|
||||
self.lightRequest.emit(v_delta)
|
||||
elif Qt.ControlModifier == int(mods) and v_delta:
|
||||
self.zoomRequest.emit(v_delta)
|
||||
else:
|
||||
v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical)
|
||||
|
||||
33
libs/lightWidget.py
Normal file
33
libs/lightWidget.py
Normal file
@ -0,0 +1,33 @@
|
||||
try:
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtWidgets import *
|
||||
except ImportError:
|
||||
from PyQt4.QtGui import *
|
||||
from PyQt4.QtCore import *
|
||||
|
||||
|
||||
class LightWidget(QSpinBox):
|
||||
|
||||
def __init__(self, title, value=50):
|
||||
super(LightWidget, self).__init__()
|
||||
self.setButtonSymbols(QAbstractSpinBox.NoButtons)
|
||||
self.setRange(0, 100)
|
||||
self.setSuffix(' %')
|
||||
self.setValue(value)
|
||||
self.setToolTip(title)
|
||||
self.setStatusTip(self.toolTip())
|
||||
self.setAlignment(Qt.AlignCenter)
|
||||
|
||||
def minimumSizeHint(self):
|
||||
height = super(LightWidget, self).minimumSizeHint().height()
|
||||
fm = QFontMetrics(self.font())
|
||||
width = fm.width(str(self.maximum()))
|
||||
return QSize(width, height)
|
||||
|
||||
def color(self):
|
||||
if self.value() == 50:
|
||||
return None
|
||||
|
||||
strength = int(self.value()/100 * 255 + 0.5)
|
||||
return QColor(strength, strength, strength)
|
||||
@ -27,6 +27,9 @@
|
||||
<file alias="zoom">resources/icons/zoom.png</file>
|
||||
<file alias="zoom-in">resources/icons/zoom-in.png</file>
|
||||
<file alias="zoom-out">resources/icons/zoom-out.png</file>
|
||||
<file alias="light_reset">resources/icons/light_reset.png</file>
|
||||
<file alias="light_lighten">resources/icons/light_lighten.png</file>
|
||||
<file alias="light_darken">resources/icons/light_darken.png</file>
|
||||
<file alias="delete">resources/icons/cancel.png</file>
|
||||
<file alias="next">resources/icons/next.png</file>
|
||||
<file alias="prev">resources/icons/prev.png</file>
|
||||
|
||||
112
resources/icons/light_brighten.svg
Normal file
112
resources/icons/light_brighten.svg
Normal file
@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="62.630001mm"
|
||||
height="62.630001mm"
|
||||
viewBox="0 0 62.630001 62.630001"
|
||||
version="1.1"
|
||||
id="svg5304"
|
||||
inkscape:export-xdpi="9.7749033"
|
||||
inkscape:export-ydpi="9.7749033"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
sodipodi:docname="light_brighten.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview5306"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="1.557211"
|
||||
inkscape:cx="34.998468"
|
||||
inkscape:cy="107.88519"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1046"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="14"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="31.348111,32.811064"
|
||||
orientation="1,0"
|
||||
id="guide1684" />
|
||||
<sodipodi:guide
|
||||
position="40.947939,31.281888"
|
||||
orientation="0,-1"
|
||||
id="guide1686" />
|
||||
<sodipodi:guide
|
||||
position="7.3908081,55.253208"
|
||||
orientation="0.70710678,0.70710678"
|
||||
id="guide1688"
|
||||
inkscape:label=""
|
||||
inkscape:locked="false"
|
||||
inkscape:color="rgb(0,0,255)" />
|
||||
<sodipodi:guide
|
||||
position="15.758196,15.75491"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide1690"
|
||||
inkscape:label=""
|
||||
inkscape:locked="false"
|
||||
inkscape:color="rgb(0,0,255)" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs5301" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-203.83832,-71.309715)">
|
||||
<circle
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.23761;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
|
||||
id="path936"
|
||||
cx="235.19633"
|
||||
cy="102.68153"
|
||||
r="10.674651" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 235.18643,85.591175 V 73.397669"
|
||||
id="path1269" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 235.18643,132.01987 V 119.82636"
|
||||
id="path1269-3" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 247.31125,114.76863 8.62212,8.62211"
|
||||
id="path1269-6" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 214.45899,81.916379 8.62212,8.62211"
|
||||
id="path1269-6-3" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 252.29226,102.65783 h 12.19352"
|
||||
id="path1269-7" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 205.84546,102.65783 h 12.19352"
|
||||
id="path1269-7-5" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 255.86336,81.91796 -8.62211,8.62212"
|
||||
id="path1269-6-5" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 223.05193,114.72939 -8.62211,8.62212"
|
||||
id="path1269-6-5-6" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
BIN
resources/icons/light_darken.png
Normal file
BIN
resources/icons/light_darken.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 487 B |
52
resources/icons/light_darken.svg
Normal file
52
resources/icons/light_darken.svg
Normal file
@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="62.228001mm"
|
||||
height="62.228001mm"
|
||||
viewBox="0 0 62.228001 62.228001"
|
||||
version="1.1"
|
||||
id="svg5125"
|
||||
inkscape:export-xdpi="9.7962332"
|
||||
inkscape:export-ydpi="9.7962332"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview5127"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="0.7786055"
|
||||
inkscape:cx="285.76731"
|
||||
inkscape:cy="139.99387"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1046"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="14"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs5122" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-29.373413,-111.60912)">
|
||||
<path
|
||||
id="path3811"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.23083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
|
||||
d="m 59.434186,113.30847 a 29.762751,29.762751 0 0 0 -14.233875,3.64581 24.884542,24.226615 0 0 1 7.144983,-1.02718 24.884542,24.226615 0 0 1 24.884111,24.22658 24.884542,24.226615 0 0 1 -24.884111,24.22726 24.884542,24.226615 0 0 1 -20.79296,-10.93947 29.762751,29.762751 0 0 0 27.881852,19.39275 29.762751,29.762751 0 0 0 29.762545,-29.76321 29.762751,29.762751 0 0 0 -29.762545,-29.76254 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/icons/light_lighten.png
Normal file
BIN
resources/icons/light_lighten.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 477 B |
BIN
resources/icons/light_reset.png
Normal file
BIN
resources/icons/light_reset.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 587 B |
84
resources/icons/light_reset.svg
Normal file
84
resources/icons/light_reset.svg
Normal file
@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="62.630001mm"
|
||||
height="62.630001mm"
|
||||
viewBox="0 0 62.630001 62.630001"
|
||||
version="1.1"
|
||||
id="svg9023"
|
||||
inkscape:export-xdpi="9.7299995"
|
||||
inkscape:export-ydpi="9.7299995"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
sodipodi:docname="light_reset.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview9025"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="2.2022289"
|
||||
inkscape:cx="78.783817"
|
||||
inkscape:cy="145.30733"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1058"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs9020" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-75.546089,-129.8161)">
|
||||
<path
|
||||
id="path936-2"
|
||||
style="stroke-width:0.893163;stroke-linecap:round;stroke-linejoin:round;paint-order:markers stroke fill"
|
||||
d="M 118.64258 78.96875 A 40.125506 40.125506 0 0 0 78.517578 119.09375 A 40.125506 40.125506 0 0 0 80.337891 130.81641 L 153.37891 99.007812 A 40.125506 40.125506 0 0 0 118.64258 78.96875 z "
|
||||
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
|
||||
<path
|
||||
id="rect8031-9"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.36721;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
|
||||
d="m 133.84074,148.31878 -9.60962,4.19947 a 24.226615,24.884542 89.927756 0 1 0.89687,6.36385 24.226615,24.884542 89.927756 0 1 -24.85372,24.25881 24.226615,24.884542 89.927756 0 1 -20.806298,-10.91315 29.762751,29.762751 0 0 0 27.905948,19.35743 29.762751,29.762751 0 0 0 29.72496,-29.80052 29.762751,29.762751 0 0 0 -3.25814,-13.46589 z" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.258714px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 75.612466,173.64974 138.37433,146.19963"
|
||||
id="path8580"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
id="path936"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.898054;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
|
||||
d="M 118.50195 78.773438 A 40.345138 40.345138 0 0 0 78.15625 119.11914 A 40.345138 40.345138 0 0 0 79.972656 130.99609 L 153.33984 98.779297 A 40.345138 40.345138 0 0 0 118.50195 78.773438 z "
|
||||
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
|
||||
<path
|
||||
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 106.88976,144.24271 V 132.0492"
|
||||
id="path1269" />
|
||||
<path
|
||||
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 86.162341,140.56791 8.62212,8.62211"
|
||||
id="path1269-6-3" />
|
||||
<path
|
||||
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 77.548811,161.30936 h 12.19352"
|
||||
id="path1269-7-5" />
|
||||
<path
|
||||
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 127.56669,140.56949 -8.62211,8.62212"
|
||||
id="path1269-6-5" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@ -52,6 +52,13 @@ fitWin=Fit Window
|
||||
fitWinDetail=Zoom follows window size
|
||||
fitWidth=Fit Width
|
||||
fitWidthDetail=Zoom follows window width
|
||||
lightbrighten=Brighten
|
||||
lightbrightenDetail=Increase Image Brightness
|
||||
lightdarken=Darken
|
||||
lightdarkenDetail=Decrease Image Brightness
|
||||
lightreset=Original Brightness
|
||||
lightresetDetail=Restore original brightness
|
||||
lightWidgetTitle=Image Brightness
|
||||
editLabel=Edit Label
|
||||
editLabelDetail=Modify the label of the selected Box
|
||||
shapeLineColor=Shape Line Color
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user