From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001
From: 单军华
Date: Wed, 11 Jul 2018 10:47:42 +0800
Subject: [PATCH] 首次上传
---
screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImageCropManager.m | 199 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 199 insertions(+), 0 deletions(-)
diff --git a/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImageCropManager.m b/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImageCropManager.m
new file mode 100644
index 0000000..2d282e0
--- /dev/null
+++ b/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImageCropManager.m
@@ -0,0 +1,199 @@
+//
+// TZImageCropManager.m
+// TZImagePickerController
+//
+// Created by ������ on 2016/12/5.
+// Copyright �� 2016��� ������. All rights reserved.
+//
+
+#import "TZImageCropManager.h"
+#import "UIView+Layout.h"
+#import <ImageIO/ImageIO.h>
+#import "TZImageManager.h"
+#import "TZImagePickerController.h"
+
+@implementation TZImageCropManager
+
+/// ������������������������
++ (void)overlayClippingWithView:(UIView *)view cropRect:(CGRect)cropRect containerView:(UIView *)containerView needCircleCrop:(BOOL)needCircleCrop {
+ UIBezierPath *path= [UIBezierPath bezierPathWithRect:[UIScreen mainScreen].bounds];
+ CAShapeLayer *layer = [CAShapeLayer layer];
+ if (needCircleCrop) { // ���������������
+ [path appendPath:[UIBezierPath bezierPathWithArcCenter:containerView.center radius:cropRect.size.width / 2 startAngle:0 endAngle: 2 * M_PI clockwise:NO]];
+ } else { // ���������������
+ [path appendPath:[UIBezierPath bezierPathWithRect:cropRect]];
+ }
+ layer.path = path.CGPath;
+ layer.fillRule = kCAFillRuleEvenOdd;
+ layer.fillColor = [[UIColor blackColor] CGColor];
+ layer.opacity = 0.5;
+ [view.layer addSublayer:layer];
+}
+
+/// ������������������������
++ (UIImage *)cropImageView:(UIImageView *)imageView toRect:(CGRect)rect zoomScale:(double)zoomScale containerView:(UIView *)containerView {
+ CGAffineTransform transform = CGAffineTransformIdentity;
+ // ���������������
+ CGRect imageViewRect = [imageView convertRect:imageView.bounds toView:containerView];
+ CGPoint point = CGPointMake(imageViewRect.origin.x + imageViewRect.size.width / 2, imageViewRect.origin.y + imageViewRect.size.height / 2);
+ CGFloat xMargin = containerView.tz_width - CGRectGetMaxX(rect) - rect.origin.x;
+ CGPoint zeroPoint = CGPointMake((CGRectGetWidth(containerView.frame) - xMargin) / 2, containerView.center.y);
+ CGPoint translation = CGPointMake(point.x - zeroPoint.x, point.y - zeroPoint.y);
+ transform = CGAffineTransformTranslate(transform, translation.x, translation.y);
+ // ���������������
+ transform = CGAffineTransformScale(transform, zoomScale, zoomScale);
+
+ CGImageRef imageRef = [self newTransformedImage:transform
+ sourceImage:imageView.image.CGImage
+ sourceSize:imageView.image.size
+ outputWidth:rect.size.width * [UIScreen mainScreen].scale
+ cropSize:rect.size
+ imageViewSize:imageView.frame.size];
+ UIImage *cropedImage = [UIImage imageWithCGImage:imageRef];
+ cropedImage = [[TZImageManager manager] fixOrientation:cropedImage];
+ CGImageRelease(imageRef);
+ return cropedImage;
+}
+
++ (CGImageRef)newTransformedImage:(CGAffineTransform)transform sourceImage:(CGImageRef)sourceImage sourceSize:(CGSize)sourceSize outputWidth:(CGFloat)outputWidth cropSize:(CGSize)cropSize imageViewSize:(CGSize)imageViewSize {
+ CGImageRef source = [self newScaledImage:sourceImage toSize:sourceSize];
+
+ CGFloat aspect = cropSize.height/cropSize.width;
+ CGSize outputSize = CGSizeMake(outputWidth, outputWidth*aspect);
+
+ CGContextRef context = CGBitmapContextCreate(NULL, outputSize.width, outputSize.height, CGImageGetBitsPerComponent(source), 0, CGImageGetColorSpace(source), CGImageGetBitmapInfo(source));
+ CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
+ CGContextFillRect(context, CGRectMake(0, 0, outputSize.width, outputSize.height));
+
+ CGAffineTransform uiCoords = CGAffineTransformMakeScale(outputSize.width / cropSize.width, outputSize.height / cropSize.height);
+ uiCoords = CGAffineTransformTranslate(uiCoords, cropSize.width/2.0, cropSize.height / 2.0);
+ uiCoords = CGAffineTransformScale(uiCoords, 1.0, -1.0);
+ CGContextConcatCTM(context, uiCoords);
+
+ CGContextConcatCTM(context, transform);
+ CGContextScaleCTM(context, 1.0, -1.0);
+
+ CGContextDrawImage(context, CGRectMake(-imageViewSize.width/2, -imageViewSize.height/2.0, imageViewSize.width, imageViewSize.height), source);
+ CGImageRef resultRef = CGBitmapContextCreateImage(context);
+ CGContextRelease(context);
+ CGImageRelease(source);
+ return resultRef;
+}
+
++ (CGImageRef)newScaledImage:(CGImageRef)source toSize:(CGSize)size {
+ CGSize srcSize = size;
+ CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, rgbColorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
+ CGColorSpaceRelease(rgbColorSpace);
+
+ CGContextSetInterpolationQuality(context, kCGInterpolationNone);
+ CGContextTranslateCTM(context, size.width/2, size.height/2);
+
+ CGContextDrawImage(context, CGRectMake(-srcSize.width/2, -srcSize.height/2, srcSize.width, srcSize.height), source);
+
+ CGImageRef resultRef = CGBitmapContextCreateImage(context);
+ CGContextRelease(context);
+ return resultRef;
+}
+
+/// ������������������
++ (UIImage *)circularClipImage:(UIImage *)image {
+ UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
+
+ CGContextRef ctx = UIGraphicsGetCurrentContext();
+ CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
+ CGContextAddEllipseInRect(ctx, rect);
+ CGContextClip(ctx);
+
+ [image drawInRect:rect];
+ UIImage *circleImage = UIGraphicsGetImageFromCurrentImageContext();
+
+ UIGraphicsEndImageContext();
+ return circleImage;
+}
+
+@end
+
+
+@implementation UIImage (TZGif)
+
++ (UIImage *)sd_tz_animatedGIFWithData:(NSData *)data {
+ if (!data) {
+ return nil;
+ }
+
+ CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
+
+ size_t count = CGImageSourceGetCount(source);
+
+ UIImage *animatedImage;
+
+ if (count <= 1) {
+ animatedImage = [[UIImage alloc] initWithData:data];
+ }
+ else {
+ // images���������������������������������������������������������count
+ NSInteger maxCount = [TZImagePickerConfig sharedInstance].gifPreviewMaxImagesCount ?: 200;
+ NSInteger interval = MAX((count + maxCount / 2) / maxCount, 1);
+
+ NSMutableArray *images = [NSMutableArray array];
+
+ NSTimeInterval duration = 0.0f;
+
+ for (size_t i = 0; i < count; i+=interval) {
+ CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
+ if (!image) {
+ continue;
+ }
+
+ duration += [self sd_frameDurationAtIndex:i source:source] * MIN(interval, 3);
+
+ [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
+
+ CGImageRelease(image);
+ }
+
+ if (!duration) {
+ duration = (1.0f / 10.0f) * count;
+ }
+
+ animatedImage = [UIImage animatedImageWithImages:images duration:duration];
+ }
+
+ CFRelease(source);
+
+ return animatedImage;
+}
+
++ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {
+ float frameDuration = 0.1f;
+ CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);
+ NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties;
+ NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary];
+
+ NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];
+ if (delayTimeUnclampedProp) {
+ frameDuration = [delayTimeUnclampedProp floatValue];
+ }
+ else {
+
+ NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];
+ if (delayTimeProp) {
+ frameDuration = [delayTimeProp floatValue];
+ }
+ }
+
+ // Many annoying ads specify a 0 duration to make an image flash as quickly as possible.
+ // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify
+ // a duration of <= 10 ms. See <rdar://problem/7689300> and <http://webkit.org/b/36082>
+ // for more information.
+
+ if (frameDuration < 0.011f) {
+ frameDuration = 0.100f;
+ }
+
+ CFRelease(cfFrameProperties);
+ return frameDuration;
+}
+
+@end
--
Gitblit v1.8.0