FLTImagePickerMetaDataUtil.m 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2019 The Flutter Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "FLTImagePickerMetaDataUtil.h"
  5. #import <Photos/Photos.h>
  6. static const uint8_t kFirstByteJPEG = 0xFF;
  7. static const uint8_t kFirstBytePNG = 0x89;
  8. static const uint8_t kFirstByteGIF = 0x47;
  9. NSString *const kFLTImagePickerDefaultSuffix = @".jpg";
  10. const FLTImagePickerMIMEType kFLTImagePickerMIMETypeDefault = FLTImagePickerMIMETypeJPEG;
  11. @implementation FLTImagePickerMetaDataUtil
  12. + (FLTImagePickerMIMEType)getImageMIMETypeFromImageData:(NSData *)imageData {
  13. uint8_t firstByte;
  14. [imageData getBytes:&firstByte length:1];
  15. switch (firstByte) {
  16. case kFirstByteJPEG:
  17. return FLTImagePickerMIMETypeJPEG;
  18. case kFirstBytePNG:
  19. return FLTImagePickerMIMETypePNG;
  20. case kFirstByteGIF:
  21. return FLTImagePickerMIMETypeGIF;
  22. }
  23. return FLTImagePickerMIMETypeOther;
  24. }
  25. + (NSString *)imageTypeSuffixFromType:(FLTImagePickerMIMEType)type {
  26. switch (type) {
  27. case FLTImagePickerMIMETypeJPEG:
  28. return @".jpg";
  29. case FLTImagePickerMIMETypePNG:
  30. return @".png";
  31. case FLTImagePickerMIMETypeGIF:
  32. return @".gif";
  33. default:
  34. return nil;
  35. }
  36. }
  37. + (NSDictionary *)getMetaDataFromImageData:(NSData *)imageData {
  38. CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
  39. NSDictionary *metadata =
  40. (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL));
  41. CFRelease(source);
  42. return metadata;
  43. }
  44. + (NSData *)updateMetaData:(NSDictionary *)metaData toImage:(NSData *)imageData {
  45. NSMutableData *mutableData = [NSMutableData data];
  46. if(imageData == nil){
  47. return mutableData;
  48. }
  49. CGImageSourceRef cgImage = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
  50. CGImageDestinationRef destination = CGImageDestinationCreateWithData(
  51. (__bridge CFMutableDataRef)mutableData, CGImageSourceGetType(cgImage), 1, nil);
  52. CGImageDestinationAddImageFromSource(destination, cgImage, 0, (__bridge CFDictionaryRef)metaData);
  53. CGImageDestinationFinalize(destination);
  54. CFRelease(cgImage);
  55. CFRelease(destination);
  56. return mutableData;
  57. }
  58. + (NSData *)convertImage:(UIImage *)image
  59. usingType:(FLTImagePickerMIMEType)type
  60. quality:(nullable NSNumber *)quality {
  61. if (quality && type != FLTImagePickerMIMETypeJPEG) {
  62. NSLog(@"image_picker: compressing is not supported for type %@. Returning the image with "
  63. @"original quality",
  64. [FLTImagePickerMetaDataUtil imageTypeSuffixFromType:type]);
  65. }
  66. switch (type) {
  67. case FLTImagePickerMIMETypeJPEG: {
  68. CGFloat qualityFloat = (quality != nil) ? quality.floatValue : 1;
  69. return UIImageJPEGRepresentation(image, qualityFloat);
  70. }
  71. case FLTImagePickerMIMETypePNG:
  72. return UIImagePNGRepresentation(image);
  73. default: {
  74. // converts to JPEG by default.
  75. CGFloat qualityFloat = (quality != nil) ? quality.floatValue : 1;
  76. return UIImageJPEGRepresentation(image, qualityFloat);
  77. }
  78. }
  79. }
  80. @end