Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소

Mac에서 대량의 스크린 샷을 크기 조정하고 싶습니다.



미리보기 앱을 사용한 리사이즈는 과연 번거롭습니다.
Automator를 사용할 수 있으면 좋았습니다만 좌절.
포인트는 대략 이야기로 나누어 이하의 2점.

1. 파일 검색 및 내보내기.
2. 크기 조정.

Command Line Tools 애플리케이션 최초 경험



iOS 프로그래머에서 Xcode를 터치하기 시작한 나는 Cocoa 프로그래밍을 모르겠습니다.
어떻게 Finder 내의 파일을 얻는가?
폴더는 어떻게 다루는 거야.
UIImage는 사용할 수 없다. -> NSImage를 사용한다.
@import AppKit 해주지 않으면 에러가 된다.
argc, argv[]는 뭐야.

0. 소스 코드 모두



main.c
#import <Foundation/Foundation.h>
@import AppKit;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        if (argc < 3) {
            NSLog(@"argment count error!");
            return -1;
        }
        //! フォルダパスの取得、
        NSString* importPath = [NSString stringWithUTF8String:argv[1]];
        NSString* exportPath = [NSString stringWithUTF8String:argv[2]];

        NSFileManager* fileManager = [NSFileManager defaultManager];
        NSArray* arrayFilePath = [fileManager contentsOfDirectoryAtPath:importPath error:nil];

        NSMutableArray* arrayfileImage = [[NSMutableArray alloc] init];
        for (NSString* fileName in arrayFilePath) {
            //! fileの拡張子を取得
            CFStringRef fileExtension = (__bridge CFStringRef) [fileName pathExtension];
            CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

            //! 画像全般を扱うならkUTTypeImage
            if (!UTTypeConformsTo(fileUTI, kUTTypeImage)) {
                NSLog(@"It's NOT an image");
                continue;
            }
            [arrayfileImage addObject:fileName];
        }

        //
        for (int i=0; i<[arrayfileImage count]; i++) {
            NSString* stringFileName = [arrayfileImage objectAtIndex:i];
            NSString* filePath = [NSString stringWithFormat:@"%@/%@", importPath, stringFileName];

            NSImage* imageOriginal;
            imageOriginal = [[NSImage alloc] initWithContentsOfFile:filePath];

            NSRect resize = NSMakeRect(0, 0, 640, 360);

            NSImage* newImage = [[NSImage alloc] initWithSize:NSMakeSize(resize.size.width, resize.size.height)];
            NSLog(@"resizeSize width = %f, height = %f", newImage.size.width, newImage.size.height);
            [newImage lockFocus];
            [imageOriginal drawInRect:resize
                             fromRect:NSMakeRect(0, 0, imageOriginal.size.width, imageOriginal.size.height)
                            operation:NSCompositingOperationSourceOver
                             fraction:1.0];
            [newImage unlockFocus];
            CGImageRef cgRef = [newImage CGImageForProposedRect:NULL
                                                        context:nil
                                                          hints:nil];
            NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef];

            [newRep setSize:[newImage size]];   // if you want the same resolution

            NSData *data = [newRep representationUsingType: NSPNGFileType
                                                properties: [NSDictionary
                                                             dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:2.0],
                                                             NSImageCompressionFactor, nil]];

            [data writeToFile:[NSString stringWithFormat:@"%@/resize%d.png",exportPath,i] atomically: NO];
        }
    }
    return 0;
}


1. 폴더에서 파일 검색 및 크기 조정 파일 내보내기



Terminal.app에서 실행하므로 실행 방법으로는 다음과 같이 한다.

app import 폴더 경로 export 폴더 경로
@import AppKit; // for NSImage
        if (argc < 3) {
            NSLog(@"argment count error!");
            return -1;
        }
        //! フォルダパスの取得、
        NSString* importPath = [NSString stringWithUTF8String:argv[1]];
        NSString* exportPath = [NSString stringWithUTF8String:argv[2]];

2. 폴더의 파일을 NSAray에 저장


        NSFileManager* fileManager = [NSFileManager defaultManager];
        NSArray* arrayFilePath = [fileManager contentsOfDirectoryAtPath:importFolderPath error:nil];

3. 파일 확장자가 image계만을 선별하여 취득


        NSMutableArray* arrayfileImage = [[NSMutableArray alloc] init];
        for (NSString* fileName in arrayFilePath) {
            //! fileの拡張子を取得
            CFStringRef fileExtension = (__bridge CFStringRef) [fileName pathExtension];
            CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

            //! 画像全般を扱うならkUTTypeImage
            if (!UTTypeConformsTo(fileUTI, kUTTypeImage)) {
                NSLog(@"It's NOT an image");
                continue;
            }
            [arrayfileImage addObject:fileName];
        }

4. 이미지 축소 및 내보내기 폴더에 쓰기



축소 후는 640x360(retina라면 1280x720)의 사이즈로, 파일명은 resize1.png, resize2.png가 되도록(듯이) 하고 있습니다.


        for (int i=0; i<[arrayfileImage count]; i++) {
            NSString* stringFileName = [arrayfileImage objectAtIndex:i];
            NSString* filePath = [NSString stringWithFormat:@"%@/%@", importFolderPath, stringFileName];

            NSImage* imageOriginal;
            imageOriginal = [[NSImage alloc] initWithContentsOfFile:filePath];

            NSRect resize = NSMakeRect(0, 0, 640, 360);

            NSImage* newImage = [[NSImage alloc] initWithSize:NSMakeSize(resize.size.width, resize.size.height)];
            NSLog(@"resizeSize width = %f, height = %f", newImage.size.width, newImage.size.height);
            [newImage lockFocus];
            [imageOriginal drawInRect:resize
                             fromRect:NSMakeRect(0, 0, imageOriginal.size.width, imageOriginal.size.height)
                            operation:NSCompositingOperationSourceOver
                             fraction:1.0];
            [newImage unlockFocus];
            CGImageRef cgRef = [newImage CGImageForProposedRect:NULL
                                                        context:nil
                                                          hints:nil];
            NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef];

            [newRep setSize:[newImage size]];   // if you want the same resolution

            NSData *data = [newRep representationUsingType: NSPNGFileType
                                                properties: [NSDictionary
                                                             dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:2.0],
                                                             NSImageCompressionFactor, nil]];

            [data writeToFile:[NSString stringWithFormat:@"%@/resize%d.png",exportFolderPath,i] atomically: NO];
        }

사용법



앱을 빌드합니다.
엔터티를 Terminal.app로 드래그 앤 드롭합니다.


이미지가 많이 들어간 import 폴더도 D&D합니다.
빈 export 폴더를 만들어 익숙해지도록 합니다.

실행하면 export 폴더 내에 resize1.png 이하가 생성된다고 생각합니다.
PNG 파일만 테스트되었습니다.

좋은 웹페이지 즐겨찾기