2013-01-09 23 views
5

Kakaoya yeni geliyorum ve yapmaya çalıştığım şey bir NSImage'ı yeniden boyutlandırmak, ancak resmimin yeniden boyutlandırılmaması nedeniyle yanlış bir şey yapıyorum gibi görünüyor. Ben başka sorular bir göz vardı ve çalışması gerekir gibi bu yaklaşım baktı:Kakao, amaç-c png görüntüsünü yeniden boyutlandırma?

- (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]; 
} 

her şey benim görüntüleri ölçekli alamadım gerçeği dışında çalışır. Birisi biraz yardımcı olabilir mi?

cevap

6

Kod parçacığınız, görüntüyü ölçeklemek/dönüştürmek için gerekli olan işlemlerden kaçınmaktadır.

- (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; 
} 

Bu entegre ederse mevcut yöntem haline:

- (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

Teşekkür! Sadece bu satırı değiştirmek zorunda kaldı: NSSize outputSize = NSSizeMake (512.0f, 512.0f); Bunun ile : NSSize outputSize = NSSizeFromString (@ "{512,512}"); – Rokas

+1

NSMakeSize sizin istediğiniz şeydir. NSSizeFromString gereksiz bir demet ayrıştırma işlemi gerçekleştirir. –

+0

Cevabı güncelleştirdim, benim deneyimimin çoğunun Cocoa Touch (CGSizeMake (genişlik, yükseklik) olarak adlandırılacaksınız) gerçeğinden taşınan bir hata ... Umarım sizin için çalışır! – isaac

0

da kullanabilirsiniz sips (script görüntü işleme sistemi kaydetmeyi denemeden önce bu gibi bir yöntemle resminizi geçirin) komut.

Parag bafna cevabı Hakkında
sips --cropToHeightWidth 10 10 input.png --out output.png 
+0

Bu komutun adı, yeniden boyutlandırmak yerine görüntüyü (seçilen alanın içinde olmayan pikselleri kırparak) BOŞLUK olduğunu gösterir. –

2

, olması gerektiği resizeing yerine "kırpma" nin "yeniden örneklemek": Şimdiye kadar en açıklayıcı cevaplar biri için

sips --resampleHeightWidth 10 10 input.png --out output.png 
İlgili konular