서버에 업로드하기 전에 iOS에서 이미지를 압축 / 크기 조정하는 방법은 무엇입니까?
현재 iOS에서 Imgur를 사용하여 다음 코드로 이미지를 서버에 업로드하고 있습니다.
NSData* imageData = UIImagePNGRepresentation(image);
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* fullPathToFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"SBTempImage.png"];
[imageData writeToFile:fullPathToFile atomically:NO];
[uploadRequest setFile:fullPathToFile forKey:@"image"];
빠른 이더넷 연결을 사용하고 있기 때문에 시뮬레이터에서 실행하고 시뮬레이터의 사진 라이브러리에서 파일을 업로드하면 코드가 제대로 작동합니다. 그러나 iPhone으로 찍은 이미지를 선택할 때 iPhone에서 동일한 코드가 시간 초과됩니다. 그래서 나는 웹에서 작은 이미지를 저장하고 그것을 업로드하려고 시도했습니다.
이것은 iPhone으로 찍은 큰 이미지가 다소 느린 3G 네트워크에서 시간 초과되었다고 믿게 만듭니다. 보내기 전에 iPhone에서 이미지를 압축 / 크기 조정하는 방법이 있습니까?
다음과 같이하면 더 작은 이미지를 만들 수 있습니다.
UIImage *small = [UIImage imageWithCGImage:original.CGImage scale:0.25 orientation:original.imageOrientation];
(4 분의 1 크기 이미지의 경우) 그런 다음 작은 이미지를 PNG 또는 필요한 형식으로 변환하십시오.
이 스 니펫은 이미지 크기를 조정합니다.
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
변수 newSize
는 a CGSize
이며 다음과 같이 정의 할 수 있습니다.
CGSize newSize = CGSizeMake(100.0f, 100.0f);
독립형 솔루션 :
- (UIImage *)compressForUpload:(UIImage *)original scale:(CGFloat)scale
{
// Calculate new size given scale factor.
CGSize originalSize = original.size;
CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize);
[original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage;
}
@Tuan Nguyen에게 감사드립니다.
@Tuan Nguyen을 보완하기 위해 이것은 아마도 가장 빠르고 우아한 방법 일 것입니다.
iphonedevelopertips.com에서 John Muchow의 게시물에 링크하려면 UIImage에 카테고리를 추가하는 것이 매우 빠른 방식으로 확장하는 매우 편리한 방법입니다. 그냥 전화
UIImage *_image = [[[UIImage alloc] initWithData:SOME_NSDATA] scaleToSize:CGSizeMake(640.0,480.0)];
더 이상 코드 줄없이 NSDATA의 640x480 표현 이미지 (온라인 이미지 일 수 있음)를 반환합니다.
Matt Gemmell의 MGImageUtilities 는 매우 훌륭하고 효율적으로 크기를 조정하고 약간의 노력을 줄이는 방법을 사용합니다.
이 코드에서 0.5는 50 %를 의미합니다.
UIImage *original = image;
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f);
이 간단한 방법을 사용하십시오 NSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);
Zorayr 기능의 신속한 구현 (크기가 아닌 실제 단위로 높이 또는 너비 제약을 포함하도록 약간 변경됨) :
class func compressForUpload(original:UIImage, withHeightLimit heightLimit:CGFloat, andWidthLimit widthLimit:CGFloat)->UIImage{
let originalSize = original.size
var newSize = originalSize
if originalSize.width > widthLimit && originalSize.width > originalSize.height {
newSize.width = widthLimit
newSize.height = originalSize.height*(widthLimit/originalSize.width)
}else if originalSize.height > heightLimit && originalSize.height > originalSize.width {
newSize.height = heightLimit
newSize.width = originalSize.width*(heightLimit/originalSize.height)
}
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize)
original.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage
}
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
+ (UIImage *)resizeImage:(UIImage *)image toResolution:(int)resolution {
NSData *imageData = UIImagePNGRepresentation(image);
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CFDictionaryRef options = (__bridge CFDictionaryRef) @{
(id) kCGImageSourceCreateThumbnailWithTransform : @YES,
(id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
(id) kCGImageSourceThumbnailMaxPixelSize : @(resolution)
};
CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options);
CFRelease(src);
UIImage *img = [[UIImage alloc]initWithCGImage:thumbnail];
return img;
}
Jagandeep Singh 방법의 Swift 2.0 버전이지만 NSData 때문에 데이터를 이미지로 변환해야합니까? UIImage가 자동으로 변환되지 않습니다.
let orginalImage:UIImage = image
let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5)
let compressedImage = UIImage(data: compressedData!)
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f);
UIImage *image = [UIImage imageNamed:@"image.png"];
NSData *imgData1 = UIImageJPEGRepresentation(image, 1);
NSLog(@"Original --- Size of Image(bytes):%d",[imgData1 length]);
NSData *imgData2 = UIImageJPEGRepresentation(image, 0.5);
NSLog(@"After --- Size of Image(bytes):%d",[imgData2 length]);
image = [UIImage imageWithData:imgData2];
imgTest.image = image;
배율로 JPG 변환을 시도하십시오. 여기에서는 0.5를 사용하고 있습니다. 제 경우 : 원본 --- 이미지 크기 (바이트) : 85KB & 이후 --- 이미지 크기 (바이트) : 23KB
-(UIImage *) resizeImage:(UIImage *)orginalImage resizeSize:(CGSize)size
{
CGFloat actualHeight = orginalImage.size.height;
CGFloat actualWidth = orginalImage.size.width;
// if(actualWidth <= size.width && actualHeight<=size.height)
// {
// return orginalImage;
// }
float oldRatio = actualWidth/actualHeight;
float newRatio = size.width/size.height;
if(oldRatio < newRatio)
{
oldRatio = size.height/actualHeight;
actualWidth = oldRatio * actualWidth;
actualHeight = size.height;
}
else
{
oldRatio = size.width/actualWidth;
actualHeight = oldRatio * actualHeight;
actualWidth = size.width;
}
CGRect rect = CGRectMake(0.0,0.0,actualWidth,actualHeight);
UIGraphicsBeginImageContext(rect.size);
[orginalImage drawInRect:rect];
orginalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return orginalImage;
}
이것은 호출하는 방법입니다
UIImage *compimage=[appdel resizeImage:imagemain resizeSize:CGSizeMake(40,40)];
그것은 이미지를 반환 합니다이 이미지 u는 어디에나 표시 할 수 있습니다 ...........
'IT TIP' 카테고리의 다른 글
32 비트 정수가 오버플로되면 64 비트 길이 대신 40 비트 구조를 사용할 수 있습니까? (0) | 2020.10.17 |
---|---|
Swift 3 GCD API 변경 후 dispatch_once (0) | 2020.10.17 |
컬이 활성화 또는 비활성화되었는지 확인하는 방법 (0) | 2020.10.17 |
MSTest 배포 항목은 프로젝트 테스트 설정 파일에있는 경우에만 작동합니까? (0) | 2020.10.17 |
Laravel 컨트롤러 하위 폴더 라우팅 (0) | 2020.10.17 |