Switch to pure Go JPEG, WEBP, AVIF and JXL codecs

This commit is contained in:
Milan Nikolic
2026-08-17 00:06:19 +02:00
parent 9f6792eaae
commit 38cb375a93
18 changed files with 56 additions and 96 deletions
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Rychlost",
EffortEffort: "Úsilí",
TipEffortWebp: "Metoda WEBP, vyšší je lepší/pomalejší (0-6, výchozí 4)",
TipEffortAvif: "Rychlost AVIF, vyšší je rychlejší/horší (0-10, výchozí 10)",
TipEffortJxl: "Úsilí JXL, vyšší je lepší/pomalejší (1-10, výchozí 7)",
TipEffortAvif: "Rychlost AVIF, vyšší je rychlejší/horší (0-10, výchozí 6)",
TipEffortJxl: "Úsilí JXL, vyšší je lepší/pomalejší (1-7, výchozí 7)",
BtnAddFiles: "Přidat &soubory...",
BtnAddDir: "Přidat &adresář...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Geschwindigkeit",
EffortEffort: "Aufwand",
TipEffortWebp: "WEBP-Methode, höher ist besser/langsamer (0-6, Standard 4)",
TipEffortAvif: "AVIF-Geschwindigkeit, höher ist schneller/schlechter (0-10, Standard 10)",
TipEffortJxl: "JXL-Aufwand, höher ist besser/langsamer (1-10, Standard 7)",
TipEffortAvif: "AVIF-Geschwindigkeit, höher ist schneller/schlechter (0-10, Standard 6)",
TipEffortJxl: "JXL-Aufwand, höher ist besser/langsamer (1-7, Standard 7)",
BtnAddFiles: "&Dateien hinzufügen...",
BtnAddDir: "&Verzeichnis hinzufügen...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Speed",
EffortEffort: "Effort",
TipEffortWebp: "WEBP method, higher is better/slower (0-6, default 4)",
TipEffortAvif: "AVIF speed, higher is faster/worse (0-10, default 10)",
TipEffortJxl: "JXL effort, higher is better/slower (1-10, default 7)",
TipEffortAvif: "AVIF speed, higher is faster/worse (0-10, default 6)",
TipEffortJxl: "JXL effort, higher is better/slower (1-7, default 7)",
BtnAddFiles: "Add &Files...",
BtnAddDir: "Add &Dir...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Velocidad",
EffortEffort: "Esfuerzo",
TipEffortWebp: "Método WEBP, más alto es mejor/más lento (0-6, predeterminado 4)",
TipEffortAvif: "Velocidad AVIF, más alto es más rápido/peor (0-10, predeterminado 10)",
TipEffortJxl: "Esfuerzo JXL, más alto es mejor/más lento (1-10, predeterminado 7)",
TipEffortAvif: "Velocidad AVIF, más alto es más rápido/peor (0-10, predeterminado 6)",
TipEffortJxl: "Esfuerzo JXL, más alto es mejor/más lento (1-7, predeterminado 7)",
BtnAddFiles: "Añadir &archivos...",
BtnAddDir: "Añadir &directorio...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Vitesse",
EffortEffort: "Effort",
TipEffortWebp: "Méthode WEBP, plus élevé est meilleur/plus lent (0-6, défaut 4)",
TipEffortAvif: "Vitesse AVIF, plus élevé est plus rapide/moins bon (0-10, défaut 10)",
TipEffortJxl: "Effort JXL, plus élevé est meilleur/plus lent (1-10, défaut 7)",
TipEffortAvif: "Vitesse AVIF, plus élevé est plus rapide/moins bon (0-10, défaut 6)",
TipEffortJxl: "Effort JXL, plus élevé est meilleur/plus lent (1-7, défaut 7)",
BtnAddFiles: "Ajouter des &fichiers...",
BtnAddDir: "Ajouter un &dossier...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Velocità",
EffortEffort: "Sforzo",
TipEffortWebp: "Metodo WEBP, più alto è migliore/più lento (0-6, predefinito 4)",
TipEffortAvif: "Velocità AVIF, più alto è più veloce/peggiore (0-10, predefinito 10)",
TipEffortJxl: "Sforzo JXL, più alto è migliore/più lento (1-10, predefinito 7)",
TipEffortAvif: "Velocità AVIF, più alto è più veloce/peggiore (0-10, predefinito 6)",
TipEffortJxl: "Sforzo JXL, più alto è migliore/più lento (1-7, predefinito 7)",
BtnAddFiles: "Aggiungi &file...",
BtnAddDir: "Aggiungi &cartella...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "速度",
EffortEffort: "労力",
TipEffortWebp: "WEBP 方式、高いほど高品質/低速(0-6、既定 4)",
TipEffortAvif: "AVIF 速度、高いほど高速/低品質(0-10、既定 10",
TipEffortJxl: "JXL 労力、高いほど高品質/低速(1-10、既定 7",
TipEffortAvif: "AVIF 速度、高いほど高速/低品質(0-10、既定 6",
TipEffortJxl: "JXL 労力、高いほど高品質/低速(1-7、既定 7",
BtnAddFiles: "ファイルを追加(&F)...",
BtnAddDir: "ディレクトリを追加(&D)...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Velocidade",
EffortEffort: "Esforço",
TipEffortWebp: "Método WEBP, mais alto é melhor/mais lento (0-6, padrão 4)",
TipEffortAvif: "Velocidade AVIF, mais alto é mais rápido/pior (0-10, padrão 10)",
TipEffortJxl: "Esforço JXL, mais alto é melhor/mais lento (1-10, padrão 7)",
TipEffortAvif: "Velocidade AVIF, mais alto é mais rápido/pior (0-10, padrão 6)",
TipEffortJxl: "Esforço JXL, mais alto é melhor/mais lento (1-7, padrão 7)",
BtnAddFiles: "Adicionar &arquivos...",
BtnAddDir: "Adicionar &diretório...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "Скорость",
EffortEffort: "Усилие",
TipEffortWebp: "Метод WEBP, выше — лучше/медленнее (0-6, по умолчанию 4)",
TipEffortAvif: "Скорость AVIF, выше — быстрее/хуже (0-10, по умолчанию 10)",
TipEffortJxl: "Усилие JXL, выше — лучше/медленнее (1-10, по умолчанию 7)",
TipEffortAvif: "Скорость AVIF, выше — быстрее/хуже (0-10, по умолчанию 6)",
TipEffortJxl: "Усилие JXL, выше — лучше/медленнее (1-7, по умолчанию 7)",
BtnAddFiles: "Добавить &файлы...",
BtnAddDir: "Добавить &каталог...",
+2 -2
View File
@@ -74,8 +74,8 @@ func init() {
EffortSpeed: "速度",
EffortEffort: "强度",
TipEffortWebp: "WEBP 方法,越高越好/越慢(0-6,默认 4)",
TipEffortAvif: "AVIF 速度,越高越快/越差(0-10,默认 10",
TipEffortJxl: "JXL 强度,越高越好/越慢(1-10,默认 7",
TipEffortAvif: "AVIF 速度,越高越快/越差(0-10,默认 6",
TipEffortJxl: "JXL 强度,越高越好/越慢(1-7,默认 7",
BtnAddFiles: "添加文件(&F)...",
BtnAddDir: "添加目录(&D)...",
+4 -37
View File
@@ -1,38 +1,12 @@
package main
import (
"runtime/debug"
"strings"
"github.com/gen2brain/cbconvert/cmd/cbconvert-gui/i18n"
"github.com/gen2brain/iup-go/iup"
)
// jxlLosslessBuild reports whether wasm2go and nodynamic leave zune-jpegxl (lossless-only) as the only jxl encoder.
var jxlLosslessBuild = func() bool {
info, ok := debug.ReadBuildInfo()
if !ok {
return false
}
var wasm2go, nodynamic bool
for _, kv := range info.Settings {
if kv.Key != "-tags" {
continue
}
for _, t := range strings.Split(kv.Value, ",") {
switch t {
case "wasm2go":
wasm2go = true
case "nodynamic":
nodynamic = true
}
}
}
return wasm2go && nodynamic
}()
// userLossless is the user's Lossless preference, tracked separately because a jxl
// wasm2go build force-sets the widget on.
// userLossless is the user's Lossless preference, kept so switching to a format
// without lossless support and back does not clear it.
var userLossless bool
func setActive() {
@@ -98,15 +72,13 @@ func setActive() {
}
canLossless := opts.Format == "webp" || opts.Format == "avif" || opts.Format == "jxl"
jxlLossless := jxlLosslessBuild && opts.Format == "jxl"
// jxl wasm2go forces lossless on; otherwise show the user's preference so it doesn't stay stuck on.
losslessVal := "OFF"
if jxlLossless || userLossless {
if userLossless {
losslessVal = "ON"
}
iup.GetHandle("Lossless").SetAttribute("VALUE", losslessVal)
losslessOn := jxlLossless || (canLossless && userLossless)
losslessOn := canLossless && userLossless
if (opts.Format == "jpeg" || canLossless) && !opts.NoConvert && !losslessOn {
iup.GetHandle("VboxQuality").SetAttribute("ACTIVE", "YES")
@@ -122,11 +94,6 @@ func setActive() {
iup.GetHandle("Lossless").SetAttribute("ACTIVE", "NO")
}
if jxlLossless {
iup.GetHandle("Lossless").SetAttribute("ACTIVE", "NO")
iup.GetHandle("VboxEffort").SetAttribute("ACTIVE", "NO")
}
if opts.Width != 0 && opts.Height != 0 && !opts.NoConvert {
iup.GetHandle("Fit").SetAttribute("ACTIVE", "YES")
} else {
+2 -2
View File
@@ -25,11 +25,11 @@ func setEffort(format string) {
val.SetAttribute("TIP", i18n.Lng(i18n.TipEffortWebp))
name = i18n.Str(i18n.EffortMethod)
case "avif":
val.SetAttributes("MIN=0, MAX=10, SHOWTICKS=11, VALUE=10")
val.SetAttributes("MIN=0, MAX=10, SHOWTICKS=11, VALUE=6")
val.SetAttribute("TIP", i18n.Lng(i18n.TipEffortAvif))
name = i18n.Str(i18n.EffortSpeed)
case "jxl":
val.SetAttributes("MIN=1, MAX=10, SHOWTICKS=10, VALUE=7")
val.SetAttributes("MIN=1, MAX=7, SHOWTICKS=7, VALUE=7")
val.SetAttribute("TIP", i18n.Lng(i18n.TipEffortJxl))
name = i18n.Str(i18n.EffortEffort)
default:
+2 -2
View File
@@ -221,7 +221,7 @@ func parseFlags() (cbconvert.Options, []string) {
convert.StringVar(&opts.Archive, "archive", base.Archive, "Archive format, valid values are zip, tar")
convert.IntVar(&opts.ZipLevel, "zip-level", base.ZipLevel, "ZIP compression level, 0 disables compression, 1-9 sets deflate level (1 fastest, 9 smallest), -1 uses the default")
convert.IntVar(&opts.Quality, "quality", base.Quality, "Image quality")
convert.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-10), -1 uses the format default")
convert.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-7), -1 uses the format default")
convert.BoolVar(&opts.Lossless, "lossless", base.Lossless, "Lossless compression (webp, avif, jxl), ignores quality")
convert.BoolVar(&opts.Combine, "combine", base.Combine, "Combine all inputs into a single archive")
convert.StringVar(&opts.OutFile, "outfile", base.OutFile, "Output file name for --combine (default: first input + -combined)")
@@ -249,7 +249,7 @@ func parseFlags() (cbconvert.Options, []string) {
cover.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the original resolution")
cover.StringVar(&opts.Format, "format", base.Format, "Image format, valid values are jpeg, png, tiff, bmp, webp, avif")
cover.IntVar(&opts.Quality, "quality", base.Quality, "Image quality")
cover.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-10), -1 uses the format default")
cover.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-7), -1 uses the format default")
cover.BoolVar(&opts.Lossless, "lossless", base.Lossless, "Lossless compression (webp, avif, jxl), ignores quality")
cover.IntVar(&opts.Filter, "filter", base.Filter, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos")
cover.StringVar(&opts.OutDir, "outdir", base.OutDir, "Output directory")