2013-01-09 11 views
5

Tôi mới làm ca cao và những gì tôi đang cố gắng làm là thay đổi kích thước một NSImage, nhưng có vẻ như tôi đang làm điều gì sai vì hình ảnh của tôi không bị thay đổi kích thước. Tôi đã xem xét các câu hỏi khác và cách tiếp cận này có vẻ như sẽ hoạt động:Ca cao, khách quan-c cách thay đổi kích thước hình ảnh 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]; 
} 

mọi thứ hoạt động, ngoại trừ việc hình ảnh của tôi không được thu nhỏ. Ai đó có thể giúp một chút?

Trả lời

6

Vì vậy, đoạn mã của bạn bỏ qua các hoạt động thực sự cần thiết để chia tỷ lệ/biến đổi hình ảnh. Vượt qua hình ảnh của bạn thông qua một phương pháp như thế này trước khi bạn cố gắng để lưu nó:

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

Nếu bạn tích hợp này vào phương pháp hiện tại của bạn:

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

Cảm ơn cho một trong những câu trả lời giải thích nhất bao giờ hết! Chỉ cần thay đổi dòng này: NSSize outputSize = NSSizeMake (512.0f, 512.0f); với cái này: NSSize outputSize = NSSizeFromString (@ "{512,512}"); – Rokas

+1

NSMakeSize là những gì bạn muốn. NSSizeFromString sẽ thực hiện một chuỗi phân tích chuỗi không cần thiết. –

+0

Cập nhật câu trả lời, một sai lầm được thực hiện từ thực tế là hầu hết kinh nghiệm của tôi là với Cocoa Touch (nơi bạn gọi CGSizeMake (chiều rộng, chiều cao)) ... Hy vọng nó hoạt động cho bạn! – isaac

0

Bạn cũng có thể sử dụng sips (hệ thống xử lý hình ảnh kịch bản) chỉ huy.

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

Tên của lệnh đó cho thấy rằng nó CROPS hình ảnh (cắt tỉa các pixel không nằm trong khu vực được chọn) thay vì thay đổi kích thước của nó. –

2

Về câu trả lời Parag Bafna của, cho resizeing nó phải được "Resample" thay vì "cây trồng":

sips --resampleHeightWidth 10 10 input.png --out output.png