@@ -10,7 +10,7 @@ interface ImageInfo {
10
10
raw : boolean ;
11
11
}
12
12
13
- interface ProcessedImage {
13
+ interface ModifiedImage {
14
14
title : string ;
15
15
previewUrl : string ;
16
16
sizeKb : number ;
@@ -24,7 +24,7 @@ interface ProcessedImage {
24
24
export async function POST ( req : NextRequest ) {
25
25
try {
26
26
const formData = await req . formData ( ) ;
27
- const processedImages : ProcessedImage [ ] = [ ] ;
27
+ const modifiedImages : ModifiedImage [ ] = [ ] ;
28
28
29
29
// Iterate through formData entries
30
30
for ( const [ key , value ] of formData . entries ( ) ) {
@@ -35,42 +35,45 @@ export async function POST(req: NextRequest) {
35
35
formData . get ( `modification${ index } ` ) as string ,
36
36
) as ImageInfo ;
37
37
38
- const processedImage = await processImage ( imageFile , imageInfo ) ;
39
- processedImages . push ( processedImage ) ;
38
+ const modifiedImage = await modifyImage ( imageFile , imageInfo ) ;
39
+ modifiedImages . push ( modifiedImage ) ;
40
40
}
41
41
}
42
42
43
- return NextResponse . json ( processedImages ) ;
43
+ return NextResponse . json ( modifiedImages ) ;
44
44
} catch ( error ) {
45
- console . error ( "Error processing images:" , error ) ;
45
+ console . error ( "Error modifying images:" , error ) ;
46
46
return NextResponse . json (
47
- { error : "Failed to process images" } ,
47
+ { error : "Failed to modify images" } ,
48
48
{ status : 500 } ,
49
49
) ;
50
50
}
51
51
}
52
52
53
- async function processImage (
53
+ async function modifyImage (
54
54
imageFile : File ,
55
55
imageInfo : ImageInfo ,
56
- ) : Promise < ProcessedImage > {
56
+ ) : Promise < ModifiedImage > {
57
57
const fileBuffer = await imageFile . arrayBuffer ( ) ;
58
- const image = sharp ( Buffer . from ( fileBuffer ) , { animated : false } ) ;
59
58
60
- const metadata = await image . metadata ( ) ;
61
59
const raw = imageInfo . raw ;
62
60
const outputTitle = imageInfo . title ;
63
61
let outputWidth ;
64
62
let outputHeight ;
65
63
let outputFormat ;
66
64
let quality ;
65
+ let imageBuffer ;
66
+ let modifiedInfo ;
67
67
68
68
if ( raw ) {
69
- outputHeight = metadata . height ;
70
- outputWidth = metadata . width ;
71
- outputFormat = metadata . format ;
72
- quality = 100 ;
69
+ imageBuffer = fileBuffer ;
70
+ outputHeight = imageInfo . height ! ;
71
+ outputWidth = imageInfo . width ! ;
72
+ outputFormat = imageInfo . format ;
73
73
} else {
74
+ const image = sharp ( Buffer . from ( fileBuffer ) , { animated : false } ) ;
75
+ const metadata = await image . metadata ( ) ;
76
+
74
77
if ( ! imageInfo . height && ! imageInfo . width ) {
75
78
outputHeight = metadata . height ;
76
79
outputWidth = metadata . width ;
@@ -83,28 +86,37 @@ async function processImage(
83
86
84
87
outputFormat = imageInfo . format ?? metadata . format ;
85
88
quality = imageInfo . quality ;
86
- }
87
89
88
- if ( ! raw ) {
89
90
image
90
91
. resize ( outputWidth , outputHeight )
91
92
. toFormat ( outputFormat as keyof sharp . FormatEnum , {
92
93
quality,
93
94
} ) ;
94
- }
95
95
96
- const { data : processedImageBuffer , info } = await image . toBuffer ( {
97
- resolveWithObject : true ,
98
- } ) ;
96
+ const {
97
+ data,
98
+ info,
99
+ } : {
100
+ data : Buffer ;
101
+ info : { height : number ; width : number ; format : string } ;
102
+ } = await image . toBuffer ( {
103
+ resolveWithObject : true ,
104
+ } ) ;
105
+
106
+ modifiedInfo = info ;
107
+ imageBuffer = data ;
108
+
109
+ outputHeight = modifiedInfo . height ;
110
+ outputWidth = modifiedInfo . width ;
111
+ outputFormat = modifiedInfo . format ;
112
+ }
99
113
100
- outputHeight = info . height ;
101
- outputWidth = info . width ;
102
- outputFormat = info . format ;
114
+ const buffer = Buffer . from ( imageBuffer ) . toString ( "base64" ) ;
103
115
104
116
return {
105
117
title : outputTitle ,
106
- previewUrl : `data:image/${ outputFormat } ;base64,${ processedImageBuffer . toString ( "base64" ) } ` ,
107
- sizeKb : processedImageBuffer . length / 1024 ,
118
+ previewUrl : `data:image/${ outputFormat } ;base64,${ buffer } ` ,
119
+ sizeKb : imageBuffer . byteLength / 1024 ,
108
120
format : outputFormat ,
109
121
height : outputHeight ,
110
122
width : outputWidth ,
0 commit comments