IT TIP

서버에 업로드하기 전에 iOS에서 이미지를 압축 / 크기 조정하는 방법은 무엇입니까?

itqueen 2020. 10. 17. 12:39
반응형

서버에 업로드하기 전에 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는 어디에나 표시 할 수 있습니다 ...........

참고 URL : https://stackoverflow.com/questions/4394491/how-to-compress-resize-image-on-ios-before-uploading-to-a-server

반응형