%PDF- %PDF-
| Direktori : /lib/calibre/calibre/gui2/dialogs/ |
| Current File : //lib/calibre/calibre/gui2/dialogs/trim_image.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
import os
import sys
from qt.core import (
QApplication, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QKeySequence,
QLabel, QSize, Qt, QToolBar, QVBoxLayout
)
from calibre.gui2 import gprefs
from calibre.gui2.tweak_book.editor.canvas import Canvas
class TrimImage(QDialog):
def __init__(self, img_data, parent=None):
QDialog.__init__(self, parent)
self.l = l = QVBoxLayout(self)
self.setWindowTitle(_('Trim Image'))
self.bar = b = QToolBar(self)
l.addWidget(b)
b.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon)
b.setIconSize(QSize(32, 32))
self.msg = la = QLabel('\xa0' + _(
'Select a region by dragging with your mouse, and then click trim'))
self.msg_txt = self.msg.text()
self.sz = QLabel('')
self.canvas = c = Canvas(self)
c.image_changed.connect(self.image_changed)
c.load_image(img_data)
self.undo_action = u = c.undo_action
u.setShortcut(QKeySequence(QKeySequence.StandardKey.Undo))
self.redo_action = r = c.redo_action
r.setShortcut(QKeySequence(QKeySequence.StandardKey.Redo))
self.trim_action = ac = self.bar.addAction(QIcon(I('trim.png')), _('&Trim'), self.do_trim)
ac.setShortcut(QKeySequence('Ctrl+T'))
ac.setToolTip('{} [{}]'.format(_('Trim image by removing borders outside the selected region'),
ac.shortcut().toString(QKeySequence.SequenceFormat.NativeText)))
ac.setEnabled(False)
c.selection_state_changed.connect(self.selection_changed)
c.selection_area_changed.connect(self.selection_area_changed)
l.addWidget(c)
self.bar.addAction(self.trim_action)
self.bar.addSeparator()
self.bar.addAction(u)
self.bar.addAction(r)
self.bar.addSeparator()
self.bar.addWidget(la)
self.bar.addSeparator()
self.bar.addWidget(self.sz)
self.bb = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
bb.accepted.connect(self.accept)
bb.rejected.connect(self.reject)
h = QHBoxLayout()
l.addLayout(h)
self.tr_sz = QLabel('')
h.addWidget(self.tr_sz)
h.addStretch(10)
h.addWidget(bb)
self.resize(QSize(900, 600))
geom = gprefs.get('image-trim-dialog-geometry', None)
if geom is not None:
QApplication.instance().safe_restore_geometry(self, geom)
self.setWindowIcon(self.trim_action.icon())
self.image_data = None
def do_trim(self):
self.canvas.trim_image()
self.selection_changed(False)
def selection_changed(self, has_selection):
self.trim_action.setEnabled(has_selection)
self.msg.setText(_('Adjust selection by dragging corners') if has_selection else self.msg_txt)
def selection_area_changed(self, rect):
if rect:
x, y, w, h = map(int, self.canvas.rect_for_trim())
text = f'{int(w)}x{int(h)}'
text = _('Size: {0}px Aspect ratio: {1:.3g}').format(text, w / h)
else:
text = ''
self.tr_sz.setText(text)
def image_changed(self, qimage):
self.sz.setText('\xa0' + _('Size: {0}x{1}px').format(qimage.width(), qimage.height()))
def cleanup(self):
self.canvas.break_cycles()
gprefs.set('image-trim-dialog-geometry', bytearray(self.saveGeometry()))
def accept(self):
if self.trim_action.isEnabled():
self.trim_action.trigger()
if self.canvas.is_modified:
self.image_data = self.canvas.get_image_data()
self.cleanup()
QDialog.accept(self)
def reject(self):
self.cleanup()
QDialog.reject(self)
if __name__ == '__main__':
from calibre.gui2 import Application
app = Application([])
fname = sys.argv[-1]
with open(fname, 'rb') as f:
data = f.read()
d = TrimImage(data)
if d.exec() == QDialog.DialogCode.Accepted and d.image_data is not None:
b, ext = os.path.splitext(fname)
fname = b + '-trimmed' + ext
with open(fname, 'wb') as f:
f.write(d.image_data)
print('Trimmed image written to', fname)