iOS 이미지 압축 크기 제한

3608 단어

1. 두 가지 이미지 압축 방법


그림을 압축하는 두 가지 방법: 그림의 질량(Quality), 그림의 사이즈(Size)를 압축한다.
압축 이미지 품질
NSData *data = UIImageJPEGRepresentation(image, compression);
UIImage *resultImage = [UIImage imageWithData:data];

UIImage와 NSData의 상호 전환을 통해 JPEG 이미지의 질을 줄여 이미지를 압축합니다.UIImageJPEGrepresentation::두 번째 인자compression 수치는 0.0~1.0입니다. 값이 작을수록 그림의 질이 낮고 그림 파일은 자연히 작아집니다.
압축 이미지 크기
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

필요한 그림 크기 크기를 지정하면, ResultImage는 원본 그림의 크기를 크기 크기로 그립니다

2. 그림을 압축하여 그림 파일을 지정한 크기보다 작게 한다


만약 사진의 선명도에 대한 요구가 높지 않고 사진의 업로드, 다운로드 속도가 빠르다면 사진을 업로드할까요?>그림을 압축해야 합니다.어느 정도로 압축하는지는 구체적인 상황을 보아야 하지만, 일반적으로 그림 파일의 최대 값을 설정한다. 예를 들어 100KB이다.상소의 두 가지 방법으로 그림을 압축할 수 있다.그림으로 전환된 NSData 대상이 데이터라고 가정하고 데이터를 통해length는 그림의 바이트 크기를 얻을 수 있습니다.
압축 이미지 품질
비교적 쉽게 생각할 수 있는 방법은 그림이 지정한 크기(maxLength)보다 조금 작을 때까지 순환을 통해 그림의 질을 점차적으로 줄이는 것이다.
 , , ; , 。
- (NSData *)compressQualityWithMaxLength:(NSInteger)maxLength {// , , 。
    CGFloat compression = 1;
    NSData *data = UIImageJPEGRepresentation(self, compression);
    while (data.length > maxLength && compression > 0) {
        compression -= 0.02;
        data = UIImageJPEGRepresentation(self, compression); // When compression less than a value, this code dose not work
    }
    return data;
}//

- (NSData *)compressQualityWithMaxLength:(NSInteger)maxLength {// 。
   CGFloat compression = 1;
    NSData *data = UIImageJPEGRepresentation(self, compression);
    if (data.length < maxLength) return data;
    CGFloat max = 1;
    CGFloat min = 0;
    for (int i = 0; i < 6; ++i) {
        compression = (max + min) / 2;
        data = UIImageJPEGRepresentation(self, compression);
        if (data.length < maxLength * 0.9) {
            min = compression;
        } else if (data.length > maxLength) {
            max = compression;
        } else {
            break;
        }
    }
    return data;
}

압축 이미지 크기
이전과 유사하게 비교적 쉽게 생각할 수 있는 방법은 그림의 크기를 지정한 크기(maxLength)보다 조금 작을 때까지 순환을 통해 점차적으로 줄이는 것이다.구체적인 코드가 생략되다.같은 문제는 순환 횟수가 많고 효율이 낮으며 시간이 오래 걸린다는 것이다.이분법으로 효율을 높일 수 있으며 구체적인 코드는 생략할 수 있다.이분법보다 더 좋고 압축 횟수가 적으며 그림을 압축한 후 지정한 크기보다 꼭 작게 할 수 있는 또 다른 방법을 소개한다(maxLength*0.9뿐만 아니라).
 , ( )。
-(NSData *)compressBySizeWithMaxLength:(NSUInteger)maxLength{
    UIImage *resultImage = self;
    NSData *data = UIImageJPEGRepresentation(resultImage, 1);
    NSUInteger lastDataLength = 0;
    while (data.length > maxLength && data.length != lastDataLength) {
        lastDataLength = data.length;
        CGFloat ratio = (CGFloat)maxLength / data.length;
        CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
                                 (NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
        UIGraphicsBeginImageContext(size);
        // Use image to draw (drawInRect:), image is larger but more compression time
        // Use result image to draw, image is smaller but less compression time
        [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
        resultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        data = UIImageJPEGRepresentation(resultImage, 1);
    }
    return data;
}

좋은 웹페이지 즐겨찾기