2013-01-09 15 views
5

मैं कोको के लिए नया हूं और मैं जो करने की कोशिश कर रहा हूं वह एक एनएसआईमेज का आकार बदल रहा है, लेकिन ऐसा लगता है कि मैं कुछ गलत कर रहा हूं क्योंकि मेरी छवि का आकार बदल नहीं गया है। मैं अन्य प्रश्न पर एक नज़र था और इस दृष्टिकोण है जैसे कि यह काम करना चाहिए देखा:कोको, उद्देश्य-सी एक पीएनजी छवि का आकार कैसे बदलें?

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

तो आपका कोड स्निपेट वास्तव में छवि को स्केल/बदलने के लिए आवश्यक संचालन को छोड़ रहा है। इसी प्रकार के एक विधि के माध्यम से अपनी छवि दर्रा इससे पहले कि आप को बचाने की कोशिश:

- (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 (स्क्रिप्ट इमेज प्रोसेसिंग प्रणाली) कमांड।

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

उस कमांड का नाम बताता है कि यह छवि को क्रॉप करता है (इसे पिक्सल को दूर करना जो चयनित क्षेत्र के अंदर नहीं है) इसे आकार देने के बजाए। –

2

बारे में पराग बाफना का जवाब, resizeing यह होना चाहिए के लिए बजाय "फसल" के "resample":

sips --resampleHeightWidth 10 10 input.png --out output.png 
संबंधित मुद्दे