CCGraphics.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. //
  2. // CCGraphics.m
  3. // Crypto Cloud Technology Nextcloud
  4. //
  5. // Created by Marino Faggiana on 04/02/16.
  6. // Copyright (c) 2014 TWS. All rights reserved.
  7. //
  8. // Author Marino Faggiana <m.faggiana@twsweb.it>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. #import "CCGraphics.h"
  24. #import "AppDelegate.h"
  25. #import "CCUtility.h"
  26. @implementation CCGraphics
  27. + (UIImage *)thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time
  28. {
  29. AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
  30. NSParameterAssert(asset);
  31. AVAssetImageGenerator *assetIG =
  32. [[AVAssetImageGenerator alloc] initWithAsset:asset];
  33. assetIG.appliesPreferredTrackTransform = YES;
  34. assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
  35. CGImageRef thumbnailImageRef = NULL;
  36. CFTimeInterval thumbnailImageTime = time;
  37. NSError *igError = nil;
  38. thumbnailImageRef =
  39. [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) actualTime:NULL error:&igError];
  40. if (!thumbnailImageRef) NSLog(@"[LOG] thumbnailImageGenerationError %@", igError );
  41. UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] : nil;
  42. return thumbnailImage;
  43. }
  44. // mix two image
  45. + (UIImage *)overlayImage:(UIImage *)backgroundImage watermarkImage:(UIImage *)watermarkImage where:(NSString *)where
  46. {
  47. // example watermarkImage = [UIImage imageNamed:@"lock"];
  48. UIGraphicsBeginImageContext(backgroundImage.size);
  49. [backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
  50. if ([where isEqualToString:@"right"]) [watermarkImage drawInRect:CGRectMake(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height)];
  51. if ([where isEqualToString:@"left"]) [watermarkImage drawInRect:CGRectMake(0, backgroundImage.size.height - watermarkImage.size.height, backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height)];
  52. UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
  53. UIGraphicsEndImageContext();
  54. return result;
  55. }
  56. + (UIImage *)generateImageFromVideo:(NSString *)videoPath
  57. {
  58. NSURL *url = [NSURL fileURLWithPath:videoPath];
  59. NSError *error = NULL;
  60. AVURLAsset* asset = [AVURLAsset URLAssetWithURL:url options:nil];
  61. AVAssetImageGenerator* imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
  62. imageGenerator.appliesPreferredTrackTransform = YES;
  63. // CMTime time = CMTimeMake(1, 65);
  64. CGImageRef cgImage = [imageGenerator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:&error];
  65. if(error) return nil;
  66. UIImage* image = [UIImage imageWithCGImage:cgImage];
  67. CGImageRelease(cgImage);
  68. return image;
  69. }
  70. + (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize
  71. {
  72. //If scaleFactor is not touched, no scaling will occur
  73. CGFloat scaleFactor = 1.0;
  74. //Deciding which factor to use to scale the image (factor = targetSize / imageSize)
  75. if (image.size.width > targetSize.width || image.size.height > targetSize.height)
  76. if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
  77. scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.
  78. UIGraphicsBeginImageContext(targetSize);
  79. //Creating the rect where the scaled image is drawn in
  80. CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
  81. (targetSize.height - image.size.height * scaleFactor) / 2,
  82. image.size.width * scaleFactor, image.size.height * scaleFactor);
  83. //Draw the image into the rect
  84. [image drawInRect:rect];
  85. //Saving the image, ending image context
  86. UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  87. UIGraphicsEndImageContext();
  88. return scaledImage;
  89. }
  90. + (UIImage *)createNewImageFrom:(NSString *)fileName directoryUser:(NSString *)directoryUser fileNameTo:(NSString *)fileNameTo fileNamePrint:(NSString *)fileNamePrint size:(NSString *)size imageForUpload:(BOOL)imageForUpload typeFile:(NSString *)typeFile writePreview:(BOOL)writePreview optimizedFileName:(BOOL)optimizedFileName
  91. {
  92. UIImage *originalImage;
  93. UIImage *scaleImage;
  94. CGRect rect;
  95. CGFloat width, height;
  96. NSString *ext = [[fileNamePrint pathExtension] lowercaseString];
  97. if ([[directoryUser substringFromIndex: [directoryUser length] - 1] isEqualToString:@"/"]) directoryUser = [directoryUser substringToIndex:[directoryUser length]-1];
  98. if (![[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/%@", directoryUser, fileName]]) return nil;
  99. // only viedo / image
  100. if (![typeFile isEqualToString: k_metadataTypeFile_image] && ![typeFile isEqualToString: k_metadataTypeFile_video]) return nil;
  101. if ([typeFile isEqualToString: k_metadataTypeFile_image]) {
  102. originalImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", directoryUser, fileName]];
  103. }
  104. if ([typeFile isEqualToString: k_metadataTypeFile_video]) {
  105. // create symbolik link for read video file in temp
  106. [[NSFileManager defaultManager] removeItemAtPath:[NSTemporaryDirectory() stringByAppendingString:@"tempvideo.mp4"] error:nil];
  107. [[NSFileManager defaultManager] linkItemAtPath:[NSString stringWithFormat:@"%@/%@", directoryUser, fileName] toPath:[NSTemporaryDirectory() stringByAppendingString:@"tempvideo.mp4"] error:nil];
  108. originalImage = [self generateImageFromVideo:[NSTemporaryDirectory() stringByAppendingString:@"tempvideo.mp4"]];
  109. }
  110. if ([size isEqualToString:@"xs"]) scaleImage = [self scaleImage:originalImage toSize:CGSizeMake(32, 32)];
  111. if ([size isEqualToString:@"s"]) scaleImage = [self scaleImage:originalImage toSize:CGSizeMake(64, 64)];
  112. if ([size isEqualToString:@"m"]) scaleImage = [self scaleImage:originalImage toSize:CGSizeMake(128, 128)];
  113. if ([size isEqualToString:@"l"]) scaleImage = [self scaleImage:originalImage toSize:CGSizeMake(640, 640)];
  114. if ([size isEqualToString:@"xl"]) scaleImage = [self scaleImage:originalImage toSize:CGSizeMake(1024, 1024)];
  115. scaleImage = [UIImage imageWithData:UIImageJPEGRepresentation(scaleImage, 0.5f)];
  116. // it is request write photo preview ?
  117. if (writePreview && scaleImage) {
  118. if (imageForUpload) {
  119. // write image preview in tmp for plist
  120. [self saveIcoWithFileID:fileNameTo image:scaleImage writeToFile:[NSTemporaryDirectory() stringByAppendingString:fileNameTo] copy:NO move:NO fromPath:nil toPath:nil];
  121. // if it is preview for Upload then trasform it in gray scale
  122. //TODO: Crash with swift
  123. scaleImage = [scaleImage grayscale];
  124. [self saveIcoWithFileID:fileNameTo image:scaleImage writeToFile:[NSString stringWithFormat:@"%@/%@.ico", directoryUser, fileNameTo] copy:NO move:NO fromPath:nil toPath:nil];
  125. } else {
  126. [self saveIcoWithFileID:fileNameTo image:scaleImage writeToFile:[NSString stringWithFormat:@"%@/%@.ico", directoryUser, fileNameTo] copy:NO move:NO fromPath:nil toPath:nil];
  127. }
  128. }
  129. // Optimized photos resolution
  130. // Resize image 640 x 480 ( with proportion : 1,333)
  131. if (originalImage.size.height < originalImage.size.width) {
  132. // (lanscape)
  133. width = 640;
  134. height = 480;
  135. } else {
  136. // (portrait)
  137. height = 640;
  138. width = 480;
  139. }
  140. // Optimized photos resolution
  141. if ([typeFile isEqualToString: k_metadataTypeFile_image] && [ext isEqualToString:@"gif"] == NO && optimizedFileName && scaleImage && (originalImage.size.width > width || originalImage.size.height > height)) {
  142. // conversion scale proportion
  143. if (height > width) {
  144. float proportion = originalImage.size.height / originalImage.size.width;
  145. width = height / proportion;
  146. } else {
  147. float proportion = originalImage.size.width / originalImage.size.height;
  148. height = width / proportion;
  149. }
  150. rect = CGRectMake(0,0,width,height);
  151. UIGraphicsBeginImageContext(rect.size);
  152. [originalImage drawInRect:rect];
  153. UIImage *resizeImage = UIGraphicsGetImageFromCurrentImageContext();
  154. UIGraphicsEndImageContext();
  155. resizeImage = [UIImage imageWithData:UIImageJPEGRepresentation(resizeImage, 0.5f)];
  156. if (resizeImage) [UIImagePNGRepresentation(resizeImage) writeToFile:[NSString stringWithFormat:@"%@/%@", directoryUser, fileNameTo] atomically: YES];
  157. }
  158. return scaleImage;
  159. }
  160. + (void)saveIcoWithFileID:(NSString *)fileID image:(UIImage *)image writeToFile:(NSString *)writeToFile copy:(BOOL)copy move:(BOOL)move fromPath:(NSString *)fromPath toPath:(NSString *)toPath
  161. {
  162. if (writeToFile)
  163. [UIImagePNGRepresentation(image) writeToFile:writeToFile atomically: YES];
  164. if (copy)
  165. [CCUtility copyFileAtPath:fromPath toPath:toPath];
  166. if (move)
  167. [[NSFileManager defaultManager] moveItemAtPath:fromPath toPath:toPath error:nil];
  168. #ifndef EXTENSION
  169. if (image && fileID)
  170. [app.icoImagesCache setObject:image forKey:fileID];
  171. #endif
  172. }
  173. + (UIView *)navigationBarTitle:(NSString *)title image:(UIImage *)image
  174. {
  175. UIView *view = [UIView new];
  176. UILabel *label = [UILabel new];
  177. label.text = title;
  178. label.textAlignment = NSTextAlignmentCenter;
  179. [label sizeToFit];
  180. label.center = view.center;
  181. UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
  182. float imageAspect = imageView.image.size.width / imageView.image.size.height;
  183. imageView.frame = CGRectMake(label.frame.origin.x-label.frame.size.height*imageAspect, label.frame.origin.y, label.frame.size.height*imageAspect, label.frame.size.height);
  184. imageView.contentMode = UIViewContentModeScaleAspectFit;
  185. [view addSubview:label];
  186. [view addSubview:imageView];
  187. [view sizeToFit];
  188. return view;
  189. }
  190. @end