Skip to content

Commit 96df0f4

Browse files
[iOS] Fix: Converting from WebP causes app crash (#222)
1 parent 6a2f5a6 commit 96df0f4

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

example/img/icon.webp

8.18 KB
Loading

example/lib/const/resource.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ class R {
1010

1111
static const String IMG_TRANSPARENT_BACKGROUND_PNG =
1212
'img/transparent-background.png';
13+
14+
static const String IMG_ICON_WEBP = 'img/icon.webp';
1315
}

example/lib/main.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,18 @@ class _MyAppState extends State<MyApp> {
287287
});
288288
}
289289

290+
void _compressFromWebPImage() async {
291+
// Converting webp to jpeg
292+
final result = await FlutterImageCompress.compressAssetImage(
293+
R.IMG_ICON_WEBP,
294+
);
295+
if (result == null) return;
296+
// Show result image
297+
safeSetState(() {
298+
provider = MemoryImage(typed_data.Uint8List.fromList(result));
299+
});
300+
}
301+
290302
@override
291303
Widget build(BuildContext context) {
292304
return MaterialApp(
@@ -372,6 +384,12 @@ class _MyAppState extends State<MyApp> {
372384
onPressed: _compressAndroidWebpExample,
373385
),
374386
),
387+
SliverToBoxAdapter(
388+
child: TextButton(
389+
child: Text('Convert from webp format'),
390+
onPressed: _compressFromWebPImage,
391+
),
392+
),
375393
],
376394
),
377395
floatingActionButton: FloatingActionButton(

ios/Classes/CompressHandler.m

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#import "CompressHandler.h"
66
#import "UIImage+scale.h"
7+
#import "UIImage+WebP.h"
78
#import "ImageCompressPlugin.h"
89
#import <SDWebImageWebPCoder/SDImageWebPCoder.h>
910

@@ -13,7 +14,7 @@ @implementation CompressHandler {
1314

1415
+ (NSData *)compressWithData:(NSData *)data minWidth:(int)minWidth minHeight:(int)minHeight quality:(int)quality
1516
rotate:(int)rotate format:(int)format {
16-
UIImage *img = [[UIImage alloc] initWithData:data];
17+
UIImage *img = [self isWebP:data] ? [UIImage sd_imageWithWebPData:data] : [[UIImage alloc] initWithData:data];
1718
return [CompressHandler compressWithUIImage:img minWidth:minWidth minHeight:minHeight quality:quality rotate:rotate format:format];
1819
}
1920

@@ -80,4 +81,13 @@ + (NSData *)compressDataWithImage:(UIImage *)image quality:(float)quality format
8081
return data;
8182
}
8283

84+
+ (BOOL)isWebP:(NSData *)data {
85+
if (data.length < 12) return false;
86+
87+
NSData *riff = [data subdataWithRange:NSMakeRange(8, 4)];
88+
NSString* format = [[NSString alloc] initWithData:riff encoding:(NSASCIIStringEncoding)];
89+
90+
return [format isEqualToString:@"WEBP"];
91+
}
92+
8393
@end

0 commit comments

Comments
 (0)