@@ -61,45 +61,16 @@ const createPostHandler: RouteHandler<typeof createPostRoute, {}> = async (c: Co
61
61
} else {
62
62
// ここに圧縮処理 (jpegにしてqualityさげる.めざせ500KB)
63
63
// File型からbufferへ
64
- //console.log(image);
65
64
const arrayBuffer = await image . arrayBuffer ( ) ;
66
65
const buffer = Buffer . from ( arrayBuffer ) ;
67
66
const new_file_name = 'file.jpg' ;
68
67
69
- await sharp ( buffer )
70
- . resize ( { height : 1080 } )
71
- . jpeg ( )
72
- . toBuffer ( )
73
- . then ( async ( resultBuffer ) => {
74
- // BufferからFile型へ変換
75
- const file = new File ( [ resultBuffer ] , new_file_name , { type : 'image/jpeg' } ) ;
76
- //console.log(file);
77
- // アップロード
78
- image_path = await uploadFile ( file ) ;
79
- //console.log(image_path);
80
- } )
81
- . catch ( ( err ) => {
82
- console . error ( '画像圧縮エラー:' , err ) ;
83
- return c . json (
84
- {
85
- message : '投稿に失敗しました.' ,
86
- statusCode : 500 ,
87
- error : 'Internal Server Error' ,
88
- } ,
89
- 500
90
- ) ;
91
- } ) ;
92
-
93
- // jpegへの変換&圧縮 (二分探索で500KB以下にする)
94
- /*
95
68
await compressImage ( buffer )
96
69
. then ( async ( resultBuffer ) => {
97
70
// BufferからFile型へ変換
98
71
const file = new File ( [ resultBuffer ] , new_file_name , { type : 'image/jpeg' } ) ;
99
- console.log(file);
100
72
// アップロード
101
73
image_path = await uploadFile ( file ) ;
102
- //console.log(image_path);
103
74
} )
104
75
. catch ( ( err ) => {
105
76
console . error ( '画像圧縮エラー:' , err ) ;
@@ -112,10 +83,8 @@ const createPostHandler: RouteHandler<typeof createPostRoute, {}> = async (c: Co
112
83
500
113
84
) ;
114
85
} ) ;
115
- */
116
86
}
117
87
118
- //console.log(image_path);
119
88
// ここからDBのpostテーブルへ情報登録
120
89
const sql = `insert into ${ env . POSTS_TABLE_NAME } (original, tanka, image_path, user_name, user_icon) values (:original, :tanka, :image_path, :user_name, :user_icon)` ;
121
90
await db . query ( sql , { original, tanka, image_path, user_name, user_icon } ) ;
@@ -144,17 +113,33 @@ const createPostHandler: RouteHandler<typeof createPostRoute, {}> = async (c: Co
144
113
145
114
export default createPostHandler ;
146
115
147
- // 二分探索で500MB以下にする
116
+ // 1080pに圧縮.それでも500KB超えていたら二分探索で500KB以下にする
148
117
async function compressImage ( inputBuffer : Buffer ) : Promise < Buffer > {
149
118
let minQuality = 1 ;
150
119
let maxQuality = 100 ;
151
120
let bestQuality = maxQuality ;
152
121
let bestBuffer : Buffer | null = null ;
153
122
const targetFileSize = 500 * 1024 ; // 500KB
154
123
124
+ // jpegに変換して,それ以外何もしなくても500KB以下か?
125
+ const compressedJpegBuffer = await sharp ( inputBuffer ) . jpeg ( ) . toBuffer ( ) ;
126
+ if ( compressedJpegBuffer . length <= targetFileSize ) {
127
+ return compressedJpegBuffer ;
128
+ }
129
+
130
+ // 1080pにして500KB以下か?
131
+ const compressed1080pBuffer = await sharp ( inputBuffer ) . resize ( { height : 1080 } ) . jpeg ( ) . toBuffer ( ) ;
132
+ if ( compressed1080pBuffer . length <= targetFileSize ) {
133
+ return compressed1080pBuffer ;
134
+ }
135
+
136
+ // 二分探索
155
137
while ( minQuality <= maxQuality ) {
156
138
const midQuality = Math . floor ( ( minQuality + maxQuality ) / 2 ) ;
157
- const compressedBuffer = await sharp ( inputBuffer ) . jpeg ( { quality : midQuality } ) . toBuffer ( ) ;
139
+ const compressedBuffer = await sharp ( inputBuffer )
140
+ . resize ( { height : 1080 } )
141
+ . jpeg ( { quality : midQuality } )
142
+ . toBuffer ( ) ;
158
143
159
144
// サイズがtargetFileSizeより大きければ,maxQualityを小さく
160
145
if ( compressedBuffer . length > targetFileSize ) {
0 commit comments