2011-09-13 9 views
2

UIImageview의 너비가 75이고 높이가 75 인 뷰가 있습니다. 카메라 또는 사진 라이브러리에서 이미지를 캡처하고 크기를 조정하고 이미지 뷰로 설정합니다.iphone 전체 화면 크기 조정 이미지 미리보기

캡처 한 이미지를 서버에 업로드했지만 크기가 조정 된 이미지가 업로드되고 이미지 품질이 손실됩니다. 서버에서 검색하는 동안 흐림 이미지가 표시됩니다.

지금, 내가, 내가 이미지 뷰에 탭 때마다 전체 화면 이미지 미리보기가 표시되어야하고, 나는 다음과 같은 코드

- (UIImage*)imageWithImage:(UIImage*)sourceImage scaledToSize:(CGSize)newSize; 
{ 
    CGFloat targetWidth = newSize.width; 
    CGFloat targetHeight = newSize.height; 

    NSLog(@"target Width:%f",targetWidth); 
    NSLog(@"target Height:%f",targetHeight); 

    CGImageRef imageRef = [sourceImage CGImage]; 
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); 
    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); 

    if (bitmapInfo == kCGImageAlphaNone) { 
     bitmapInfo = kCGImageAlphaPremultipliedLast; 
    } 

    CGContextRef bitmap; 

    if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) { 
     bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 

     NSLog(@"ImageOrientation UP/DOWN"); 

    } else { 
     bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 

    } 

    if (sourceImage.imageOrientation == UIImageOrientationLeft) { 
     NSLog(@"ImageOrientation LEFT"); 

     CGContextRotateCTM (bitmap, radians(90)); 
     CGContextTranslateCTM (bitmap, 0, -targetHeight); 

    } else if (sourceImage.imageOrientation == UIImageOrientationRight) { 
     NSLog(@"ImageOrientation RIGHT"); 
     CGContextRotateCTM (bitmap, radians(-90)); 
     CGContextTranslateCTM (bitmap, -targetWidth, 0); 

    } else if (sourceImage.imageOrientation == UIImageOrientationUp) { 
     NSLog(@"ImageOrientation UP/DOWN"); 
     // NOTHING 
    } else if (sourceImage.imageOrientation == UIImageOrientationDown) { 
     CGContextTranslateCTM (bitmap, targetWidth, targetHeight); 
     CGContextRotateCTM (bitmap, radians(-180.)); 
    } 

    // CGContextSetInterpolationQuality(bitmap, 1); 

    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef); 
    CGImageRef ref = CGBitmapContextCreateImage(bitmap); 
    UIImage* newImage = [UIImage imageWithCGImage:ref]; 

    CGContextRelease(bitmap); 
    CGImageRelease(ref); 

    return newImage; 
} 
를 사용하여 이미지 크기를 조정할

고품질 이미지 대신 크기가 조정 된 이미지 업로드해야 필요 복원되지 않습니다 다시 위쪽으로 크기를 조정 - 당신이 품질이 손실 75x75까지 이미지 크기를 조절하면

나에게

+2

같은 축소 된 크기의 새로운 이미지를 생성하지 않는 콘텐츠 모드를 변경하면됩니다. 그것은 하나의 이미지에 대한 나쁜 생각은 아닐 것이다. – Robin

+0

@robin : 이미지를 업데이트하면 이미지가 업데이트되면 앱이 다운됩니다. 메모리 경고 – duk

답변

0

도와주세요. 따라서 서버에 업로드 할 때 전달할 원래의 크기가 조정되지 않은 이미지에 대한 참조를 유지해야합니다. 수동으로 크기를 변경 한 사본과 업로드 할 원본 사본의 두 가지 사본을 유지하면서 전체 크기보기에서 후자를 사용하여이 작업을 수행 할 수 있습니다.

그러나 위의 설명에서 로빈 (Robin)이 언급 한 것처럼 UIImageView의 콘텐츠 모드를 사용하여 콘텐츠 모드에 따라보기 내에서 이미지의 크기를 자동으로 조정할 수 있습니다. 상황에

관련 콘텐츠 모드는 다음과 같습니다

UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFill, UIViewContentModeScaleAspectFit

다음은 모든 이미지가 75x75있는 UIImageView

myImageView.contentMode = UIViewContentModeScaleAspectFit; 
myImageView.image = myUnscaledImage; 
내에서 크기를 조정할 수 원인이됩니다

ScaleToFill은 이미지를 늘려서 사용 가능한 공간을 채 웁니다 e - 이것이 왜곡 되더라도.

ScaleAspectFill은 가장 짧은 치수 (너비 또는 높이)가 사용 가능한 공간을 채우도록 이미지를 늘리고 가장 긴 치수 (너비 또는 높이)를 자릅니다. 가장 긴 치수가 여전히 사용 가능한 공간에 맞도록

ScaleAspectFit는 이미지를 늘릴 것이며,

UIViewContentModeScaleAspectFit 맞게 가능성이 가장 높은 것 하나입니다 (수평 또는 수직) 짧은 차원의 주위에 빈 공간을 남겨 당신의 골.

전체 화면 이미지를 팝업하는 한 가지 방법은 UIImageView를 투명한 버튼으로 감싸고 터치를위한 액션 핸들러를 추가하는 것입니다. 전체 이미지를 보려면 이미지보기가있는 모달보기 컨트롤러가 있어야합니다. 보기. 또는 이미지 뷰를 서브 클래 싱하고 자신 만의 터치 처리를 추가하거나 투명한 버튼 대신 제스처 인식기를 사용하십시오.

전체 크기 이미지가보기 창보다 크고 스크롤 할 수 있도록하려면 스크롤보기 안에 넣으십시오. 확대/축소가 가능하도록하려면 스크롤보기를 사용하는 대신 웹보기에서 img 태그로로드하십시오.

디스플레이를 임시로 사용하려면 NSTimer를 사용하고 시간이 지나면 모달보기 컨트롤러를 닫거나 업로드 http 요청의 끝을 청취하고 이미지 업로드가 완료되면 전체 크기보기를 닫습니다 . 당신은 같은 이미지의 크기를 조정하는

+0

두 개의 사본 즉 크기 조정 된 이미지와 원본 이미지를 그대로 유지했는데 이미지 뷰에서 탭할 때 전체 화면 이미지 미리보기를 구현하는 방법 – duk

+0

내 의견에 몇 가지 제안 사항이 추가되었습니다. – gamozzii

+0

위 : 감사합니다 gamozzii, 그것은 작동하지만 하나의 문제는 메모리 경고를 떠나 전체 화면에서 이미지를 보는 동안 응용 프로그램이 충돌합니다. 어떻게 1952x3264 픽셀의 이미지를 처리해야합니까. – duk

0

, 왜 당신은 단지 작은 이미지 뷰에 표시 할 수 75x75의 작은 크기로 크기를 조정의 그래서 그 대신이

+ (UIImage*)scaledImageForImage:(UIImage*)image newSize:(CGSize)newSize 
{ 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
}