2009-10-13 5 views
2

는 여기에 지금까지있어 무엇 :NSImage를 최대 파일 크기로 조정하는 가장 좋은 방법이 있습니까?

NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData: 
       [file.image TIFFRepresentation]]; 
// Resize image to 200x200 
CGFloat maxSize = 200.0; 
NSSize imageSize = imageRep.size; 
if (imageSize.height>maxSize || imageSize.width>maxSize) { 
    // Find the aspect ratio 
    CGFloat aspectRatio = imageSize.height/imageSize.width; 
    CGSize newImageSize; 
    if (aspectRatio > 1.0) { 
     newImageSize = CGSizeMake(maxSize/aspectRatio, maxSize); 
    } else if (aspectRatio < 1.0) { 
     newImageSize = CGSizeMake(maxSize, maxSize * aspectRatio); 
    } else { 
     newImageSize = CGSizeMake(maxSize, maxSize); 
    } 
    [imageRep setSize:NSSizeFromCGSize(newImageSize)]; 
} 


NSData *imageData = [imageRep representationUsingType:NSPNGFileType properties:nil]; 
NSString *outputFilePath = [@"~/Desktop/output.png" stringByExpandingTildeInPath]; 
[imageData writeToFile:outputFilePath atomically:NO]; 

코드는 200x200 크기 PNG 내 크기 제한 인 128K보다 적을 수 있다고 가정합니다. 200x200은 충분히 크지 만 가능한 한 크기를 최대한 늘리고 싶습니다.

  1. 코드는 작동하지 않습니다 여기에

    내 두 가지 문제가 있습니다. 내 보낸 파일의 크기를 확인하고 원본 크기와 같습니다.
  2. 내보낼 때까지 출력 파일의 크기를 예측할 수있는 방법이 없으므로 치수를 최대화 할 수 있지만 여전히 128K 미만의 이미지를 얻을 수 있습니까?

여기 작업 코드입니다. 꽤 엉성하고 약간의 최적화를 사용할 수는 있지만,이 시점에서 충분히 빠르게 실행되므로 걱정하지 않아도됩니다. 대부분의 사진에서 100 배 이상 반복되며 밀리 초 단위로 처리됩니다. 또한이 메서드는 NSImage의 범주에 선언되어 있습니다.

- (NSData *)resizeImageWithBitSize:(NSInteger)size 
         andImageType:(NSBitmapImageFileType)fileType { 

    CGFloat maxSize = 500.0; 
    NSSize originalImageSize = self.size; 
    NSSize newImageSize; 
    NSData *returnImageData; 
    NSInteger imageIsTooBig = 1000; 

    while (imageIsTooBig > 0) { 
      if (originalImageSize.height>maxSize || originalImageSize.width>maxSize) { 
      // Find the aspect ratio 
      CGFloat aspectRatio = originalImageSize.height/originalImageSize.width; 
      if (aspectRatio > 1.0) { 
       newImageSize = NSMakeSize(maxSize/aspectRatio, maxSize); 
      } else if (aspectRatio < 1.0) { 
       newImageSize = NSMakeSize(maxSize, maxSize * aspectRatio); 
      } else { 
       newImageSize = NSMakeSize(maxSize, maxSize); 
      } 
     } else { 
      newImageSize = originalImageSize; 
     } 

     NSImage *resizedImage = [[NSImage alloc] initWithSize:newImageSize]; 

     [resizedImage lockFocus]; 
     [self drawInRect:NSMakeRect(0, 0, newImageSize.width, newImageSize.height) 
       fromRect: NSMakeRect(0, 0, originalImageSize.width, originalImageSize.height) 
       operation: NSCompositeSourceOver 
       fraction: 1.0]; 
     [resizedImage unlockFocus]; 

     NSData *tiffData = [resizedImage TIFFRepresentation]; 
     [resizedImage release]; 

     NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:tiffData]; 
     NSDictionary *imagePropDict = [NSDictionary 
             dictionaryWithObject:[NSNumber numberWithFloat:0.85] 
                forKey:NSImageCompressionFactor]; 

     returnImageData = [imageRep representationUsingType:fileType properties:imagePropDict]; 
     [imageRep release]; 

     if ([returnImageData length] > size) { 
      maxSize = maxSize * 0.99; 
      imageIsTooBig--; 
     } else { 
      imageIsTooBig = 0; 
     } 

    } 

    return returnImageData; 
} 

답변

0

언급 다른 포스터 1

들어에는 setSize는 이미지의 디스플레이 크기와 기본 이미지 파일이 아닌 실제의 픽셀 데이터를 변경한다.

크기를 조정하려면 원본 이미지를 다른 NSImageRep에 다시 그려서 파일에 쓸 수 있습니다.

이 블로그 게시물에는 이러한 방식으로 크기를 조정하는 방법에 대한 몇 가지 샘플 코드가 포함되어 있습니다.

How to Resize an NSImage

2.

위해 나는 적어도 메모리에 객체를 생성하고 이미지의 길이를 확인하지 않고 당신이 할 수 있다고 생각하지 않습니다. 사용 된 실제 바이트는 이미지 유형에 따라 다릅니다. ARGB가있는 비트 맵은 크기를 예측하기 쉽지만 PNG와 JPEG는 훨씬 더 어려울 것입니다.

+0

링크가 매력처럼 작동했습니다. 감사! – kubi

+1

weblog.scifihifi.com이 다운 된 것 같습니다. – auco

0

[imageData length] 당신에게 내가 디스크에 기록 된 최종 파일의 크기로 이해하고있는 NSData의 내용,의 길이를 제공해야합니다. 그렇게하면 실제로 파일을 작성하기 전에 파일 크기를 최대화 할 수 있습니다. 이미지 the docs for setSize에 따라 감소 또는 증가되지 않는 이유에

:

화상 데이터의 물리적 크기와 함께 이미지 표현의 크기는 이미지의 해상도를 결정한다.

그래서 해상도를 변경 크기를 설정하고하지 않음으로써 어떤 픽셀, 픽셀이 해석되어야하는 단지 방식을 수정하지 않는 것이있을 수 있습니다.

+0

저는 코코아 개발을하지 않습니다.하지만 지금까지 해왔 던 경험이 있다면, 교육받은 추측으로 시작하는 바이너리 검색은 여러분에게 신속하게 답변을 줄 것입니다. –