diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py
index d8e158f842..a4d3a5b540 100644
--- a/resources/default_tweaks.py
+++ b/resources/default_tweaks.py
@@ -385,6 +385,12 @@ sort_dates_using_visible_fields = False
generate_cover_title_font = None
generate_cover_foot_font = None
+#: Fuzz value for trimming covers
+# The value used for the fuzz distance when trimming a cover.
+# Colors within this distance are considered equal.
+# The distance is in absolute intensity units.
+cover_trim_fuzz_value = 10
+
#: Control behavior of the book list
# You can control the behavior of doubleclicks on the books list.
# Choices: open_viewer, do_nothing,
diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py
index c72f1533a5..5f6d3bcc3a 100644
--- a/src/calibre/gui2/dialogs/metadata_bulk.py
+++ b/src/calibre/gui2/dialogs/metadata_bulk.py
@@ -204,6 +204,16 @@ class MyBlockingBusyNew(QDialog): # {{{
covers.sort(key=lambda x: x[1])
if covers:
cache.set_cover({book_id:covers[-1][0]})
+ elif args.cover_action == 'trim':
+ from calibre.utils.magick import Image
+ for book_id in self.ids:
+ cdata = cache.cover(book_id)
+ if cdata:
+ im = Image()
+ im.load(cdata)
+ im.trim(tweaks['cover_trim_fuzz_value'])
+ cdata = im.export('jpg')
+ cache.set_cover({book_id:cdata})
# Formats
if args.do_remove_format:
@@ -423,6 +433,15 @@ class MyBlockingBusy(QDialog): # {{{
if covers:
self.db.set_cover(id, covers[-1][0])
covers = []
+ elif cover_action == 'trim':
+ from calibre.utils.magick import Image
+ cdata = self.db.cover(id, index_is_id=True)
+ if cdata:
+ im = Image()
+ im.load(cdata)
+ im.trim(tweaks['cover_trim_fuzz_value'])
+ cdata = im.export('jpg')
+ self.db.set_cover(id, cdata)
if do_remove_format:
self.db.remove_format(id, remove_format, index_is_id=True,
@@ -1213,6 +1232,8 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog):
cover_action = 'generate'
elif self.cover_from_fmt.isChecked():
cover_action = 'fromfmt'
+ elif self.cover_trim.isChecked():
+ cover_action = 'trim'
args = Settings(remove_all, remove, add, au, aus, do_aus, rating, pub, do_series,
do_autonumber, do_remove_format, remove_format, do_swap_ta,
diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui
index 2b48e635be..afc5e55449 100644
--- a/src/calibre/gui2/dialogs/metadata_bulk.ui
+++ b/src/calibre/gui2/dialogs/metadata_bulk.ui
@@ -603,6 +603,13 @@ Future conversion of these books will use the default settings.
+ -
+
+
+ &Trim cover
+
+
+
-
diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py
index 3d1a439deb..b7bb0252ef 100644
--- a/src/calibre/gui2/metadata/basic_widgets.py
+++ b/src/calibre/gui2/metadata/basic_widgets.py
@@ -971,7 +971,7 @@ class Cover(ImageView): # {{{
return
im = Image()
im.load(cdata)
- im.trim(10)
+ im.trim(tweaks['cover_trim_fuzz_value'])
cdata = im.export('png')
self.current_val = cdata