support more images natively

This commit is contained in:
2025-02-24 16:56:40 -05:00
parent 312a49d838
commit 8b060fb2ec
3 changed files with 41 additions and 105 deletions

22
go.mod
View File

@@ -2,31 +2,31 @@ module git.yetaga.in/alazyreader/why
go 1.24.0
require modernc.org/tk9.0 v0.62.1-0.20250222163156-e78eb59c0674
require modernc.org/tk9.0 v0.62.1-0.20250224173824-a16d85dfdb90
require (
github.com/JackMordaunt/icns v1.0.0 // indirect
github.com/adrg/xdg v0.5.3 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ebitengine/purego v0.8.0 // indirect
github.com/ebitengine/purego v0.8.2 // indirect
github.com/evilsocket/islazy v1.11.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924 // indirect
github.com/mat/besticon/v3 v3.18.0 // indirect
github.com/matryer/is v1.4.1 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect
golang.org/x/image v0.20.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect
golang.org/x/image v0.24.0 // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/sys v0.30.0 // indirect
modernc.org/fileutil v1.3.0 // indirect
modernc.org/fsm v1.2.1 // indirect
modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0 // indirect
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 // indirect
modernc.org/knuth v0.5.4 // indirect
modernc.org/libX11 v0.11.2 // indirect
modernc.org/libXau v0.9.2 // indirect
@@ -40,13 +40,13 @@ require (
modernc.org/libfreetype v0.9.1 // indirect
modernc.org/libmd v0.12.0 // indirect
modernc.org/libtcl9.0 v0.15.1 // indirect
modernc.org/libtk9.0 v0.14.0 // indirect
modernc.org/libtk9.0 v0.15.0 // indirect
modernc.org/libxcb v0.11.0 // indirect
modernc.org/libz v0.16.10 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.8.2 // indirect
modernc.org/ngrab v0.1.0 // indirect
modernc.org/rec v0.2.0 // indirect
modernc.org/rec v0.3.1 // indirect
modernc.org/regexp v1.7.3 // indirect
modernc.org/sortutil v1.2.1 // indirect
modernc.org/strutil v1.2.1 // indirect

46
go.sum
View File

@@ -8,20 +8,20 @@ github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE=
github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/evilsocket/islazy v1.11.0 h1:B5w6uuS6ki6iDG+aH/RFeoMb8ijQh/pGabewqp2UeJ0=
github.com/evilsocket/islazy v1.11.0/go.mod h1:muYH4x5MB5YRdkxnrOtrXLIBX6LySj1uFIqys94LKdo=
github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI=
github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4=
github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924 h1:uXvs2WoTfOUZuGu+qJUUZWb5UxBU59DLlZhZBxNgBFs=
github.com/machinebox/appify v0.0.0-20180512101119-15c1e09ce924/go.mod h1:sqsRpT+VgEXox31qA9IQ9sEO8VQ/q7v7Y9WFxWkQTF0=
github.com/mat/besticon/v3 v3.18.0 h1:dEDT5cXp8s/UH4Gh2uWEmguxGexU7q22MKjBzZmfd70=
github.com/mat/besticon/v3 v3.18.0/go.mod h1:J8y+A9X0Oxxsq5+gaeIzn5/6XcJe1rsnhpFOXsq9/6A=
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
@@ -36,20 +36,20 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo=
golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w=
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw=
golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM=
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
@@ -65,8 +65,8 @@ modernc.org/fsm v1.2.1 h1:HbM58bXxL5O2lcZV2MLunCelmbcx0pfEABx5MiBdVcU=
modernc.org/fsm v1.2.1/go.mod h1:EDGRSaPWy3qP70XVpUVVqkUplm0myW+jAohuM5RajEs=
modernc.org/gc/v2 v2.6.3 h1:aJVhcqAte49LF+mGveZ5KPlsp4tdGdAOT4sipJXADjw=
modernc.org/gc/v2 v2.6.3/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0 h1:Iox2PD9TaVKyyCdDn7A3KuDd4ELb9TcrsA/2iXzRRtU=
modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0/go.mod h1:1hU1kIUddpAm7byqo+bfUr4X6PwhHSjb3cNv5yXlzEs=
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 h1:IYXPPTTjjoSHvUClZIYexDiO7g+4x+XveKT4gCIAwiY=
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/knuth v0.5.4 h1:F8mDs7ME3oN9eyx01n6/xVmJ4F5U/qEhSYPnPXaZrps=
modernc.org/knuth v0.5.4/go.mod h1:e5SBb35HQBj2aFwbBO3ClPcViLY3Wi0LzaOd7c/3qMk=
modernc.org/libX11 v0.11.2 h1:tAqv1KVQEDhBqQ/1gfSmEAQtAoOjteOTHZZoiB7AfUQ=
@@ -93,8 +93,8 @@ modernc.org/libmd v0.12.0 h1:aAvpjpr7FJUrO14hghEB5QK7Prvl6Cbf7D8vSswxojE=
modernc.org/libmd v0.12.0/go.mod h1:QQBOHm77lZsemt1VbO7fQhDUYO0/dy5KR1nLVm5YvLY=
modernc.org/libtcl9.0 v0.15.1 h1:DM9nzm+VPFeEpPYYSLfRif9vneEklR9/OCkrabMdrbw=
modernc.org/libtcl9.0 v0.15.1/go.mod h1:WVZziJEB6DHMOG7nTfRXKzOzFF9dfdI6aA/GkpffgXg=
modernc.org/libtk9.0 v0.14.0 h1:X2cLLoObDTlXwf0c6fwmSWP48tfABIuvqUBfsLySUmM=
modernc.org/libtk9.0 v0.14.0/go.mod h1:D6csINNOuk5lLMab20kjhCK0JxQfL02IaAPa9vnj2G4=
modernc.org/libtk9.0 v0.15.0 h1:Utszid60BZ6gNfvAwhkOyI3Lot4ScrVJ2uuHGLl5WOQ=
modernc.org/libtk9.0 v0.15.0/go.mod h1:D6csINNOuk5lLMab20kjhCK0JxQfL02IaAPa9vnj2G4=
modernc.org/libxcb v0.11.0 h1:MzVt6ETBHfAjQeZYH3J5vKzHn7HihZd3FSKbQb9mK1Y=
modernc.org/libxcb v0.11.0/go.mod h1:Wht2E7ngaJG36GguDTdXkHXItBFPFVXAcN7w8pJW9ug=
modernc.org/libz v0.16.10 h1:EzVXcQypULQaMZvYCTaUrifHI3w+qJC32tVHhIJME6w=
@@ -107,8 +107,8 @@ modernc.org/ngrab v0.1.0 h1:21cX4tAIfLNjR4ax7JMfHTz2ztnjVGcCSsztoG6EFMk=
modernc.org/ngrab v0.1.0/go.mod h1:dDGjUip6IXmb5Y5M8RPYD7Sg4S/VdfG5akxK34uYtOE=
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/rec v0.2.0 h1:bvKWh/hNdAkdcUxWXAmyBQ1htADn5n5ad5G8boPp4Og=
modernc.org/rec v0.2.0/go.mod h1:SoaswcFNRf7GmLiMHK1672ac60D2KmUFmu5rRrZDBPo=
modernc.org/rec v0.3.1 h1:4mh3pdjaTpASWDVQuETe6mACr9QL7WYgd0iTHkCO5JA=
modernc.org/rec v0.3.1/go.mod h1:MC9UAyhDSYlAkWc5x/6HbwkYaP4f/SU8XxvRvtVSYu4=
modernc.org/regexp v1.7.3 h1:XOyVuWwhINI1jwwEkEKBNXAgfdYKOJ7iRgQH1zYlol0=
modernc.org/regexp v1.7.3/go.mod h1:w871IJbq9BwRr+ZtUZ9D7+p7qPAFWTN47ESu46YcGjI=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
@@ -117,9 +117,7 @@ modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/tcl9.0 v0.15.25 h1:3xNx26D+vYmSY3K9FaNdPmlHd8Hcz39YGiqsBFCYx5c=
modernc.org/tcl9.0 v0.15.25/go.mod h1:hCbqZz0GQRzN3Xnfn4dKpMCwvA9sfEb+Go++cw1cJ3A=
modernc.org/tk9.0 v0.62.0 h1:V4lyYhCRSXZKn+txvjZCyUnWodAFVJRYFDpFuLldGlk=
modernc.org/tk9.0 v0.62.0/go.mod h1:vzTmvDro5F7yCnusSheZrF8VXXOzmY9RxH2c5M3YFqc=
modernc.org/tk9.0 v0.62.1-0.20250222163156-e78eb59c0674 h1:iIzjoNi8sZ4lw0zIjfNNX730AqytNGIRnE+bZgrWhTg=
modernc.org/tk9.0 v0.62.1-0.20250222163156-e78eb59c0674/go.mod h1:vzTmvDro5F7yCnusSheZrF8VXXOzmY9RxH2c5M3YFqc=
modernc.org/tk9.0 v0.62.1-0.20250224173824-a16d85dfdb90 h1:Dx3Jpf1yfZ9ji/jMDn5AYf4ZDvmURWqt9AVhN62/xwY=
modernc.org/tk9.0 v0.62.1-0.20250224173824-a16d85dfdb90/go.mod h1:8S1bkOevk09kDEinpidMkwm1Zb3SLx2XhGhuXqj97u4=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

78
main.go
View File

@@ -1,19 +1,12 @@
package main
import (
"bytes"
_ "embed"
"fmt"
"image"
"image/draw"
"image/jpeg"
"image/png"
"io"
"log"
"os"
"path/filepath"
"slices"
"time"
tk "modernc.org/tk9.0"
)
@@ -24,22 +17,13 @@ import (
var noise []byte
var validFileTypes = []tk.FileType{
{
TypeName: "JPEG",
Extensions: []string{".jpg", ".jpeg"},
},
{
TypeName: "GIF",
Extensions: []string{".gif"},
},
{
TypeName: "PNG",
Extensions: []string{".png"},
},
{
TypeName: "SVG",
Extensions: []string{".svg"},
},
{TypeName: "BMP", Extensions: []string{".bmp"}},
{TypeName: "JPEG", Extensions: []string{".jpg", ".jpeg"}},
{TypeName: "GIF", Extensions: []string{".gif"}},
{TypeName: "PNG", Extensions: []string{".png"}},
{TypeName: "SVG", Extensions: []string{".svg"}},
{TypeName: "TGA", Extensions: []string{".tga"}},
{TypeName: "TIFF", Extensions: []string{".tiff"}},
}
var metaActive bool
@@ -63,42 +47,6 @@ func isImage(entry os.DirEntry) bool {
return false
}
func isType(filename string, desired string) bool {
ext := filepath.Ext(filename)
if ext == "" {
return false
}
for _, ft := range validFileTypes {
if slices.Contains(ft.Extensions, ext) && ft.TypeName == desired {
return true
}
}
return false
}
func jpegToPng(in io.Reader) (*bytes.Buffer, error) {
start := time.Now()
buf := new(bytes.Buffer)
img, err := jpeg.Decode(in)
if err != nil {
return nil, fmt.Errorf("unable to decode jpeg: %w", err)
}
b := img.Bounds()
dst := image.NewNRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
draw.Draw(dst, dst.Bounds(), img, b.Min, draw.Src)
if err := (&png.Encoder{
CompressionLevel: -2,
}).Encode(buf, dst); err != nil {
return nil, fmt.Errorf("unable to encode png: %w", err)
}
end := time.Now()
log.Printf("jpeg to png took %v", end.Sub(start))
return buf, nil
}
func newFileInDirectory(img *tk.LabelWidget) func() {
return func() {
files := tk.GetOpenFile(tk.Filetypes(validFileTypes))
@@ -152,17 +100,7 @@ func updateImage(file string, img *tk.LabelWidget) {
log.Println(err.Error())
return
}
var r io.Reader
if isType(file, "JPEG") {
r, err = jpegToPng(f)
if err != nil {
log.Println(err.Error())
return
}
} else {
r = f
}
i, err := io.ReadAll(r)
i, err := io.ReadAll(f)
if err != nil {
log.Println(err.Error())
return