2014-02-24 10 views
0

나는이 시간 동안 내 머리를 긁적 거리고 있습니다.iOS : 메서드 호출에서 CGBitmapContextCreate를 사용하여 올바른 결과를 얻지 못했습니다.

다음 이미지를 사용하여 2 개의 이미지 크기를 조정하고 있습니다. 차례로 :

CGImageRef imageReference = [image CGImage]; 
bytes = malloc(width * height * 4); 

NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * width; 
NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(bytes, width, height, bitsPerComponent, 
           bytesPerRow, colorSpaceReference, 
           kCGImageAlphaPremultipliedLast); 

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageReference); 
CGImageRelease(imageReference); 
CGContextRelease(context); 

문제없이 작동하지만 이미지는 하나뿐입니다. I는 예를 들어, 다시이 메소드를 호출 할 경우 image1.sizeimage2.size :

[self resizeImageWithSize:imageSize]; //this is OK. 
[self resizeImageWithSize:imageSize]; //this would not come out right 

영상 크기에 의해 결정된다. 메서드의 호출 순서를 뒤집어 봤습니다. 첫 번째 메서드는 항상 정확합니다.

그들은 크기가 너무 크지 않습니다. 400 x 300, 300 x 360입니다. 크기를 200 x 200으로 조정하고 다른 크기를 150 x 150로 조정하고 싶습니다.

이 방법을 다시 호출하면 두 번째 이미지가 잘못됩니다. 종이에 물 얼룩 같은 픽셀을 엉망으로 만든다는 잘못된 것입니다. 때로는 심지어 인식 할 수 없게 렌더링됩니다.

제가 누락되었습니다. 매우 여기에 분명한 사항이 있습니까? 나는 free(bytes);을 시도했다. 나는 여기에서 필요하지 않다고 생각한다. 그러나 노력하기 위해, 그러나 그것은 아직도 아무것도 가져 오지 않는다. 메서드를 호출 할 때 두 번째로 오래된 바이트 데이터가 계속 유지되도록 올바르게 해제하거나 해제하지 않습니까? 나는 여기서 추측하고있다. ARC를 사용하고 있습니다. 희망이 도움이 될 것입니다

답변

1

나는이 방법을 사용하고하고 그것이 마치 마법처럼 작동합니다 :

- (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)newSize 
{ 
    UIImage *newImage = nil; 

    UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0); 
    [image drawInRect:CGRectMake(0.0, 
           0.0, 
           newSize.width, 
           newSize.height)]; 
    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 

} 
+0

감사합니다. 그러나 위의 방법이 왜 잘못되었는지 계속 알고 싶습니다. +1, 좋은 깨끗한 방법을 공유하기 위해, 그러나. – Unheilig

+0

@Unheilig, 코드와 UIGraphicsEndImageContext() 앞에 UIGraphicsBeginImageContext (<# CGSize size #>)를 넣으십시오. 당신의 코드 다음에. 그것은 내가 관심이 있다면 작동 말해 : –

+0

피드백 : 덕분에 많은 팁,하지만 그것을 해결하지 않습니다. – Unheilig