Added TestEncodeToBestSize()
This commit is contained in:
parent
3b7fbf94d3
commit
8ec0ec4341
|
@ -24,8 +24,7 @@ func renderJpeg(w io.Writer, m image.Image, config EncodeConfig) error {
|
||||||
return jpeg.Encode(w, m, o)
|
return jpeg.Encode(w, m, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
func EncodeToBestSize(bb *bytes.Buffer, img image.Image, size uint) error {
|
func EncodeToBestSize(bb *bytes.Buffer, img image.Image, size ResizeDimension) error {
|
||||||
// TODO test
|
|
||||||
q := MaxJpegQuality
|
q := MaxJpegQuality
|
||||||
for q > MinJpegQuality-1 {
|
for q > MinJpegQuality-1 {
|
||||||
|
|
||||||
|
@ -50,6 +49,7 @@ func EncodeToBestSize(bb *bytes.Buffer, img image.Image, size uint) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bb.Reset()
|
||||||
q -= 2
|
q -= 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package images
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -44,3 +45,48 @@ func TestEncode(t *testing.T) {
|
||||||
require.Exactly(t, c.RenderSize, bb.Len())
|
require.Exactly(t, c.RenderSize, bb.Len())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEncodeToBestSize(t *testing.T) {
|
||||||
|
cs := []struct {
|
||||||
|
FileName string
|
||||||
|
RenderSize int
|
||||||
|
Error error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"elephant.jpg",
|
||||||
|
1467,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rose.webp",
|
||||||
|
8513,
|
||||||
|
errors.New("image size after processing exceeds max, expect < '5632', received < '8513'"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spin.gif",
|
||||||
|
2407,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"status.png",
|
||||||
|
4725,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cs {
|
||||||
|
img, err := Decode(path + c.FileName)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
bb := bytes.NewBuffer([]byte{})
|
||||||
|
err = EncodeToBestSize(bb, img, ResizeDimensions[0])
|
||||||
|
|
||||||
|
require.Exactly(t, c.RenderSize, bb.Len())
|
||||||
|
|
||||||
|
if c.Error != nil {
|
||||||
|
require.EqualError(t, err, c.Error.Error())
|
||||||
|
} else {
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -8,16 +8,16 @@ import (
|
||||||
"github.com/oliamb/cutter"
|
"github.com/oliamb/cutter"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Resize(size uint, img image.Image) image.Image {
|
func Resize(size ResizeDimension, img image.Image) image.Image {
|
||||||
var width, height uint
|
var width, height uint
|
||||||
|
|
||||||
switch{
|
switch{
|
||||||
case img.Bounds().Max.X == img.Bounds().Max.Y:
|
case img.Bounds().Max.X == img.Bounds().Max.Y:
|
||||||
width, height = size, size
|
width, height = uint(size), uint(size)
|
||||||
case img.Bounds().Max.X > img.Bounds().Max.Y:
|
case img.Bounds().Max.X > img.Bounds().Max.Y:
|
||||||
width, height = 0, size
|
width, height = 0, uint(size)
|
||||||
default:
|
default:
|
||||||
width, height = size, 0
|
width, height = uint(size), 0
|
||||||
}
|
}
|
||||||
|
|
||||||
return resize.Resize(width, height, img, resize.Bilinear)
|
return resize.Resize(width, height, img, resize.Bilinear)
|
||||||
|
|
|
@ -10,15 +10,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestResize(t *testing.T) {
|
func TestResize(t *testing.T) {
|
||||||
sizes := []uint{80, 240, 1000}
|
sizes := []ResizeDimension{80, 240, 1000}
|
||||||
|
|
||||||
cs := []struct{
|
cs := []struct{
|
||||||
Filename string
|
Filename string
|
||||||
Bounds map[uint]image.Rectangle
|
Bounds map[ResizeDimension]image.Rectangle
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"elephant.jpg",
|
"elephant.jpg",
|
||||||
map[uint]image.Rectangle{
|
map[ResizeDimension]image.Rectangle{
|
||||||
80: {
|
80: {
|
||||||
Min: image.Point{X: 0, Y: 0},
|
Min: image.Point{X: 0, Y: 0},
|
||||||
Max: image.Point{X: 80, Y: 80},
|
Max: image.Point{X: 80, Y: 80},
|
||||||
|
@ -35,7 +35,7 @@ func TestResize(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"rose.webp",
|
"rose.webp",
|
||||||
map[uint]image.Rectangle{
|
map[ResizeDimension]image.Rectangle{
|
||||||
80: {
|
80: {
|
||||||
Min: image.Point{X: 0, Y: 0},
|
Min: image.Point{X: 0, Y: 0},
|
||||||
Max: image.Point{X: 107, Y: 80},
|
Max: image.Point{X: 107, Y: 80},
|
||||||
|
@ -52,7 +52,7 @@ func TestResize(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spin.gif",
|
"spin.gif",
|
||||||
map[uint]image.Rectangle{
|
map[ResizeDimension]image.Rectangle{
|
||||||
80: {
|
80: {
|
||||||
Min: image.Point{X: 0, Y: 0},
|
Min: image.Point{X: 0, Y: 0},
|
||||||
Max: image.Point{X: 80, Y: 80},
|
Max: image.Point{X: 80, Y: 80},
|
||||||
|
@ -69,7 +69,7 @@ func TestResize(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"status.png",
|
"status.png",
|
||||||
map[uint]image.Rectangle{
|
map[ResizeDimension]image.Rectangle{
|
||||||
80: {
|
80: {
|
||||||
Min: image.Point{X: 0, Y: 0},
|
Min: image.Point{X: 0, Y: 0},
|
||||||
Max: image.Point{X: 80, Y: 80},
|
Max: image.Point{X: 80, Y: 80},
|
||||||
|
|
|
@ -16,11 +16,11 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ResizeDimensions = []uint{80, 240}
|
ResizeDimensions = []ResizeDimension{80, 240}
|
||||||
|
|
||||||
// DimensionSizeLimit the size limits imposed on each resize dimension
|
// DimensionSizeLimit the size limits imposed on each resize dimension
|
||||||
// Figures are based on the following sample data https://github.com/status-im/status-react/issues/11047#issuecomment-694970473
|
// Figures are based on the following sample data https://github.com/status-im/status-react/issues/11047#issuecomment-694970473
|
||||||
DimensionSizeLimit = map[uint]DimensionSize{
|
DimensionSizeLimit = map[ResizeDimension]DimensionLimits{
|
||||||
80: {
|
80: {
|
||||||
Ideal: 2560, // Base on the largest sample image at quality 60% (2,554 bytes ∴ 1024 * 2.5)
|
Ideal: 2560, // Base on the largest sample image at quality 60% (2,554 bytes ∴ 1024 * 2.5)
|
||||||
Max: 5632, // Base on the largest sample image at quality 80% + 50% margin (3,683 bytes * 1.5 ≈ 5500 ∴ 1024 * 5.5)
|
Max: 5632, // Base on the largest sample image at quality 80% + 50% margin (3,683 bytes * 1.5 ≈ 5500 ∴ 1024 * 5.5)
|
||||||
|
@ -32,9 +32,10 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
type DimensionSize struct {
|
type DimensionLimits struct {
|
||||||
Ideal int
|
Ideal int
|
||||||
Max int
|
Max int
|
||||||
}
|
}
|
||||||
|
|
||||||
type FileType uint
|
type FileType uint
|
||||||
|
type ResizeDimension uint
|
||||||
|
|
Loading…
Reference in New Issue