趣味コードでそんなに大したものでもないので、変換部分を晒してしまいます。
ここって解決後にコメントできるのかわかりませんが、どなたでも、もし突っ込みがあったら宜しくおねがいします。
go
1 // png画像をトリミングして正方形にリサイズ
2 func resizeImage ( c echo . Context , imageByte [ ] byte ) ( [ ] byte , error ) {
3 img , err := png . Decode ( bytes . NewReader ( imageByte ) )
4 if err != nil {
5 return nil , err
6 }
7
8 bounds := img . Bounds ( )
9 coordinate := image . Rectangle {
10 Min : image . Point {
11 X : bounds . Max . X ,
12 Y : bounds . Max . Y ,
13 } ,
14 Max : image . Point {
15 X : bounds . Min . X ,
16 Y : bounds . Min . Y ,
17 } ,
18 }
19
20 for y := bounds . Min . Y ; y < bounds . Max . Y ; y ++ {
21 for x := bounds . Min . X ; x < bounds . Max . X ; x ++ {
22 _ , _ , _ , a := img . At ( x , y ) . RGBA ( )
23 if a > 0 {
24 if x < coordinate . Min . X {
25 coordinate . Min . X = x
26 }
27 if y < coordinate . Min . Y {
28 coordinate . Min . Y = y
29 }
30 if x > coordinate . Max . X {
31 coordinate . Max . X = x
32 }
33 if y > coordinate . Max . Y {
34 coordinate . Max . Y = y
35 }
36 }
37 }
38 }
39
40 // img(image.Image)のinterfaceにSubImageが定義されていないため、再定義する
41 type SubImager interface {
42 SubImage ( r image . Rectangle ) image . Image
43 }
44 // 型アサーション
45 if subimg , ok := img . ( SubImager ) ; ok {
46 cropped := subimg . SubImage ( coordinate )
47
48 // 縦横のサイズが異なる場合、正方形になるように加工する
49 if coordinate . Dx ( ) != coordinate . Dy ( ) {
50 edgeLength := coordinate . Dx ( )
51 if edgeLength < coordinate . Dy ( ) {
52 edgeLength = coordinate . Dy ( )
53 }
54
55 background := image . NewRGBA ( image . Rect ( 0 , 0 , edgeLength , edgeLength ) )
56 palette := color . RGBA { 0 , 0 , 0 , 0 }
57 draw . Draw ( background , background . Bounds ( ) , & image . Uniform { palette } , image . ZP , draw . Src )
58
59 // croppedは出力するまで加工前画像の属性に過ぎないため、座標補正時にトリミング範囲を引く
60 newX := ( edgeLength - coordinate . Dx ( ) ) / 2 - coordinate . Min . X
61 newY := ( edgeLength - coordinate . Dy ( ) ) / 2 - coordinate . Min . Y
62
63 newRect := image . Rectangle { image . Point { newX , newY } , background . Bounds ( ) . Size ( ) }
64 draw . Draw ( background , newRect , cropped , image . Point { 0 , 0 } , draw . Src )
65
66 // 加工済みの画像で上書き
67 cropped = background
68 }
69
70 tmp := bytes . NewBuffer ( [ ] byte { } )
71 err = png . Encode ( tmp , cropped )
72 if err != nil {
73 return nil , err
74 }
75
76 return tmp . Bytes ( ) , nil
77 }
78
79 return nil , fmt . Errorf ( "resize failed!" )
80 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。