diff --git a/imgsrc/trim.svg b/imgsrc/trim.svg
new file mode 100644
index 0000000000..8c8810fc66
--- /dev/null
+++ b/imgsrc/trim.svg
@@ -0,0 +1,688 @@
+
+
+
+
diff --git a/resources/images/trim.png b/resources/images/trim.png
new file mode 100644
index 0000000000..3cb93adfa6
Binary files /dev/null and b/resources/images/trim.png differ
diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py
index 26dbda6ca4..53788809b6 100644
--- a/src/calibre/gui2/dialogs/metadata_single.py
+++ b/src/calibre/gui2/dialogs/metadata_single.py
@@ -300,6 +300,24 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
self.cpixmap = pix
self.cover_data = cdata
+ def trim_cover(self, *args):
+ from calibre.utils.magick import Image
+ cdata = self.cover_data
+ if not cdata:
+ return
+ im = Image()
+ im.load(cdata)
+ im.trim(10)
+ cdata = im.export('jpg')
+ pix = QPixmap()
+ pix.loadFromData(cdata)
+ self.cover.setPixmap(pix)
+ self.cover_changed = True
+ self.cpixmap = pix
+ self.cover_data = cdata
+
+
+
def sync_formats(self):
old_extensions, new_extensions, paths = set(), set(), {}
for row in range(self.formats.count()):
@@ -380,6 +398,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
self.remove_unused_series)
QObject.connect(self.auto_author_sort, SIGNAL('clicked()'),
self.deduce_author_sort)
+ self.trim_cover_button.clicked.connect(self.trim_cover)
self.connect(self.author_sort, SIGNAL('textChanged(const QString&)'),
self.author_sort_box_changed)
self.connect(self.authors, SIGNAL('editTextChanged(const QString&)'),
diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui
index 74febf9c29..dbf825e706 100644
--- a/src/calibre/gui2/dialogs/metadata_single.ui
+++ b/src/calibre/gui2/dialogs/metadata_single.ui
@@ -625,6 +625,17 @@ Using this button to create author sort will change author sort from red to gree
+ -
+
+
+ Remove border (if any) from cover
+
+
+
+ :/images/trim.png:/images/trim.png
+
+
+
-