From eb850eb03967107a73c1f2fc502f57cc793f3bb6 Mon Sep 17 00:00:00 2001 From: Linghua Zhang Date: Mon, 25 Nov 2024 19:37:09 +0900 Subject: [PATCH] feat: #43 Add PNG support --- internal/images/image.go | 6 ++++-- internal/images/image_test.go | 24 +++++++++++++++++++++++- internal/testdata/testdata.go | 10 ++++++++++ testdata/png/test.png | Bin 0 -> 21630 bytes 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 testdata/png/test.png diff --git a/internal/images/image.go b/internal/images/image.go index 2ed222b..dd97610 100644 --- a/internal/images/image.go +++ b/internal/images/image.go @@ -6,6 +6,7 @@ import ( "image/jpeg" _ "image/jpeg" "path/filepath" + "slices" "strings" "github.com/disintegration/imaging" @@ -20,8 +21,9 @@ type ImageSize struct { } func IsPhotoSupported(path string) bool { - lowerExt := strings.ToLower(filepath.Ext(path)) - return lowerExt == ".jpeg" || lowerExt == ".jpg" || lowerExt == ".webp" + return slices.Contains( + []string{".jpeg", ".jpg", ".webp", ".png"}, + strings.ToLower(filepath.Ext(path))) } func GetPhotoSize(path string) (*ImageSize, error) { diff --git a/internal/images/image_test.go b/internal/images/image_test.go index 7e280fc..79fa437 100644 --- a/internal/images/image_test.go +++ b/internal/images/image_test.go @@ -14,7 +14,8 @@ func TestPhotoSupport(t *testing.T) { assert.True(t, IsPhotoSupported("photo.jpg")) assert.True(t, IsPhotoSupported("photo.jpeg")) assert.True(t, IsPhotoSupported("photo.webp")) - assert.False(t, IsPhotoSupported("photo.png")) + assert.True(t, IsPhotoSupported("photo.png")) + assert.False(t, IsPhotoSupported("photo.xxx")) } func TestGetPhotoSize(t *testing.T) { @@ -101,3 +102,24 @@ func TestWebpSupport(t *testing.T) { checksum, _ := files.Checksum(path) assert.Equal(t, testdata.WebpExpectedThubmnailChecksum, *checksum) } + +func TestPngSupport(t *testing.T) { + tmp, err := os.MkdirTemp("", "foto-test") + assert.Nil(t, err) + + size, err := GetPhotoSize(testdata.PngTestFile) + assert.Equal(t, testdata.PngTestfileWidth, size.Width) + assert.Equal(t, testdata.PngTestfileHeight, size.Height) + + path := filepath.Join(tmp, "resized.png") + + err = ResizeImage(testdata.PngTestFile, path, testdata.PngThumbnailWidth, testdata.CompressQuality) + assert.Nil(t, err) + + size, err = GetPhotoSize(path) + assert.Equal(t, testdata.PngThumbnailWidth, size.Width) + assert.Equal(t, testdata.PngThumbnailHeight, size.Height) + + checksum, _ := files.Checksum(path) + assert.Equal(t, testdata.PngExpectedThubmnailChecksum, *checksum) +} diff --git a/internal/testdata/testdata.go b/internal/testdata/testdata.go index 3924948..c553e4d 100644 --- a/internal/testdata/testdata.go +++ b/internal/testdata/testdata.go @@ -130,3 +130,13 @@ var ( WebpThumbnailHeight = 480 WebpExpectedThubmnailChecksum = "5a5f8fcae2e37e504d6e062ee8adefac45ec9102a410faa16d4a0278b310b0c8" ) + +var ( + PngTestFile = "../../testdata/png/test.png" + PngTestfileWidth = 1024 + PngTestfileHeight = 768 + + PngThumbnailWidth = 640 + PngThumbnailHeight = 480 + PngExpectedThubmnailChecksum = "c52322af93c85de909aa5774f58ab2b26ad13f95e405f4ce42703468f3490ab3" +) diff --git a/testdata/png/test.png b/testdata/png/test.png new file mode 100644 index 0000000000000000000000000000000000000000..6230df17d935dc9703af55831820ec61ee5cb486 GIT binary patch literal 21630 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 aF&P%h$I2*+*!v%vI@b&}i>^BS^8WzF9~!9u literal 0 HcmV?d00001