2013-01-09 14 views
5

私はココアが新しく、何をしようとしているのかはNSImageのサイズを変更することですが、イメージのサイズが変更されないので、何か間違っているようです。私は他の質問を見ていたし、それが動作するはずのように、このアプローチが見えた:Cocoa、objective-c png画像のサイズを変更する方法は?

- (void)scaleIcons:(NSString *)outputPath{ 
NSImage *anImage; 
NSSize imageSize; 
NSString *finalPath; 

anImage = [self image]; 

imageSize = [anImage size]; 
imageSize.width = 512; 
imageSize.height = 512; 
[anImage setSize:imageSize]; 

finalPath = [outputPath stringByAppendingString:@"/icon_512x512.png"]; 

NSData *imageData = [anImage TIFFRepresentation]; 
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData]; 
NSData *dataToWrite = [rep representationUsingType:NSPNGFileType properties:nil]; 
[dataToWrite writeToFile:finalPath atomically:NO]; 
} 

すべてが私の画像がスケーリングされませんという事実を除いて、動作します。誰か助けてもらえますか?

答えて

6

あなたのコードスニペットでは、実際に画像の拡大/縮小に必要な操作が省略されています。あなたはそれを保存しようとする前に、このようなこの1の方法を通して、あなたのイメージを渡します

- (NSImage *)scaleImage:(NSImage *)image toSize:(NSSize)targetSize 
{ 
    if ([image isValid]) 
    { 
    NSSize imageSize = [image size]; 
    float width = imageSize.width; 
    float height = imageSize.height; 
    float targetWidth = targetSize.width; 
    float targetHeight = targetSize.height; 
    float scaleFactor = 0.0; 
    float scaledWidth = targetWidth; 
    float scaledHeight = targetHeight; 

    NSPoint thumbnailPoint = NSZeroPoint; 

    if (!NSEqualSizes(imageSize, targetSize)) 
    { 
     float widthFactor = targetWidth/width; 
     float heightFactor = targetHeight/height; 

     if (widthFactor < heightFactor) 
     { 
     scaleFactor = widthFactor; 
     } 
     else 
     { 
     scaleFactor = heightFactor; 
     } 

     scaledWidth = width * scaleFactor; 
     scaledHeight = height * scaleFactor; 

     if (widthFactor < heightFactor) 
     { 
     thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
     } 

     else if (widthFactor > heightFactor) 
     { 
     thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
     } 

    NSImage *newImage = [[NSImage alloc] initWithSize:targetSize]; 

    [newImage lockFocus]; 

    NSRect thumbnailRect; 
    thumbnailRect.origin = thumbnailPoint; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [image drawInRect:thumbnailRect 
       fromRect:NSZeroRect 
      operation:NSCompositeSourceOver 
       fraction:1.0]; 

    [newImage unlockFocus]; 
    } 

    return newImage; 
} 

、既存の方法にこれを統合する場合:

- (void)scaleIcons:(NSString *)outputPath{ 

    NSSize outputSize = NSMakeSize(512.0f,512.0f); 
    NSImage *anImage = [self scaleImage:[self image] toSize:outputSize]; 

    NSString *finalPath = [outputPath stringByAppendingString:@"/icon_512x512.png"]; 
    NSData *imageData = [anImage TIFFRepresentation]; 
    NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData]; 
    NSData *dataToWrite = [rep representationUsingType:NSPNGFileType properties:nil]; 
    [dataToWrite writeToFile:finalPath atomically:NO]; 
} 
+0

感謝を!ちょうどこの行を変更しなければなりません:NSSize outputSize = NSSizeMake(512.0f、512.0f);これと一緒に :NSSize outputSize = NSSizeFromString(@ "{512,512}"); – Rokas

+1

NSMakeSizeはあなたが望むものです。 NSSizeFromStringは不要な文字列解析を行います。 –

+0

答えを更新しました。私の経験の大半はココアタッチ(CGSizeMake(幅、高さ)と呼ぶところです)からの間違いです。 – isaac

0

あなたはまたsips(スクリプト可能な画像処理システムを使用することができます)コマンドを使用します。 Parag Bafnaの答えについて

sips --cropToHeightWidth 10 10 input.png --out output.png 
+0

このコマンドの名前は、サイズを変更するのではなく、選択した領域にないピクセルをトリミングすることを示しています。 –

2

、それは代わりに「作物」の「リサンプル」でなければなりませんresizeingのため:これまでで最も説明の答えの一つのための

sips --resampleHeightWidth 10 10 input.png --out output.png 
関連する問題