Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소
16569 단어 MacOSXcommandXcode7.3Objective-C
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 파일만 테스트되었습니다.
Reference
이 문제에 관하여(Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fettelapaua/items/9e5fed0536f393f547c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 파일만 테스트되었습니다.
Reference
이 문제에 관하여(Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fettelapaua/items/9e5fed0536f393f547c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@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]];
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 파일만 테스트되었습니다.
Reference
이 문제에 관하여(Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fettelapaua/items/9e5fed0536f393f547c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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];
}
축소 후는 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 파일만 테스트되었습니다.
Reference
이 문제에 관하여(Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fettelapaua/items/9e5fed0536f393f547c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Objective-C에서 OSX 폴더의 이미지 파일을 함께 축소), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fettelapaua/items/9e5fed0536f393f547c3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)