在 Mac OS X 10.6.8 和 Xcode 3.2.6 下的 Objective-C 中的命令行应用程序中打开离线 jpg 图像

Open offline jpg-images in a command-line-application in Objective-C under Mac OS X 10.6.8 and Xcode 3.2.6

我的工作:我是 Objective-C 的新手,我在我的旧 Macbook 2,1 上编写了一个命令行应用程序来处理图片。

我的问题:我只想获取保存在本地硬盘驱动器“Macintosh HD”上的图片的宽度和高度(整数、NSInteger、NSNumber,...)。

对其他人的相关性:必须有一种程序化的方式来处理图片。这是非常基本的。

我的工作平台:我正在 Mac OS X 10.6.8 和 Xcode 3.2.6 上开发。

我的研究历史:我已经在 Whosebug 和其他一些网站上寻找食谱和背景知识来进行以下试验,但我还没有成功。我在下面展示了我尝试过的所有内容。事先没有任何效果。

//BildOeffner.h:

#import <Cocoa/Cocoa.h>
@interface BildOeffner : NSView 
    -(BildOeffner*) init;
    - (NSNumber*) extrahiereBildBreite:(NSString*) bildPfad;
@end

//BildOeffner.m:

#import "BildOeffner.h"
@implementation BildOeffner
    // extracts the image width
    - (NSNumber*) extrahiereBildBreite:(NSString*) bildPfad{
    NSBitmapImageRep* nsImageRep = [NSBitmapImageRep imageRepWithContentsOfFile:bildPfad];
    NSInteger extrahierteBildBreite =[nsImageRep pixelsWide];
    NSNumber* bildBreite = [NSNumber numberWithInt:extrahierteBildBreite];
    return bildBreite;
    }
@end

代码在编辑器中没有显示编译错误,但构建结果中有错误:错误消息:

Ld build/Debug/FotobuchErsteller_0 normal x86_64
cd /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/gcc-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk     -L/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug     -F/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug -filelist /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/Objects-normal/x86_64/FotobuchErsteller_0.LinkFileList -mmacosx-version-min=10.6 -framework Foundation -o /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug/FotobuchErsteller_0

Undefined symbols:
  "_OBJC_CLASS_$_NSImage", referenced from:
  objc-class-ref-to-NSImage in BildOeffner.o
  "_OBJC_METACLASS_$_NSView", referenced from:
  _OBJC_METACLASS_$_BildOeffner in BildOeffner.o
  "_OBJC_CLASS_$_NSView", referenced from:
  _OBJC_CLASS_$_BildOeffner in BildOeffner.o
  "_OBJC_CLASS_$_NSBitmapImageRep", referenced from:
  objc-class-ref-to-NSBitmapImageRep in BildOeffner.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

然后我尝试了以下方法:

//BildAnalyst.h:

#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
@interface BildAnalyst : NSObject
@property (assign) NSArray* bilderListe;
@property (assign) NSArray* bildObjektListe;
@property (assign) NSNumber* erwarteteBildHoehe;
@property (assign) NSNumber* erwarteteBildBreite;

-(BildAnalyst*) init;
-(BildAnalyst*) initWith:(NSArray*) neueBilderListe;

- (NSArray *)bilderListe;
- (void)setBilderListe:(NSArray *) neueBilderListe;
- (NSArray *)bildObjektListe;
- (void)setBildObjektListe:(NSArray *) neueBildObjektListe;
- (NSNumber*)erwarteteBildHoehe;
- (void)setErwarteteBildHoehe:(NSNumber*) neueErwarteteBildHoehe;
- (NSNumber*)erwarteteBildBreite;
- (void)setErwarteteBildBreite:(NSNumber*) neueErwarteteBildBreite;

- (void) erstelleListeAllerBilderImOrdner:(NSString*) absoluterPfadZumOrdner;
- (void) analysiereBilderListe;
@end

//BildAnalyst.m:

#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#import "BildAnalyst.h"
#import "Bild.h"
@implementation BildAnalyst

- (id)init {
self = [super init];
    if (self){
    self.bilderListe = nil;
    self.erwarteteBildHoehe = [NSNumber numberWithInt:3024];
    self.erwarteteBildBreite = [NSNumber numberWithInt:4032];
    }
return self;
}

/*Der explizite Konstruktor dieser Klasse.
 Parameter: NSMutableArray neueBilderListe
 Rueckgabe: BildAnalyst bildAnalyst*/
-(BildAnalyst*) initWith:(NSMutableArray*) neueBilderListe{
self = [super init];
    if (self){
        self.bilderListe = neueBilderListe;
    }
return self;
}

- (void) setBilderListe:(NSArray *) neueBilderListe{
    self.bilderListe = neueBilderListe;
}

- (NSArray *) bilderListe{
    return self.bilderListe;
}

- (void)setBildObjektListe:(NSArray *) neueBildObjektListe{
    self.bildObjektListe = neueBildObjektListe;
}

- (NSArray *)bildObjektListe{
    return self.bildObjektListe;
}

- (NSNumber*)erwarteteBildHoehe{
    return self.erwarteteBildHoehe;
}

- (void)setErwarteteBildHoehe:(NSNumber*) neueErwarteteBildHoehe{
    self.erwarteteBildHoehe = neueErwarteteBildHoehe;
}

- (NSNumber*)erwarteteBildBreite{
    return self.erwarteteBildBreite;
}

- (void)setErwarteteBildBreite:(NSNumber*) neueErwarteteBildBreite{
    self.erwarteteBildBreite = neueErwarteteBildBreite;
}


/* Die folgende Methode dient dem Auslesen eines Ordners und dem Speichern von darin enthaltenen Objekten in erster Hierarchieebene in ein Array, welches die Instanzvariable "bilderListe" befuellt.
 Parameter NSString* absoluterPfadZumOrdner*/
- (void) erstelleListeAllerBilderImOrdner:(NSString*) absoluterPfadZumOrdner{
    NSError* fehlerBeimLesenDesBilderordners;
    NSFileManager* nsFileManager = [NSFileManager defaultManager];
    [nsFileManager changeCurrentDirectoryPath:absoluterPfadZumOrdner];
    NSArray* dateiListe = [nsFileManager contentsOfDirectoryAtPath:absoluterPfadZumOrdner error:&fehlerBeimLesenDesBilderordners];
    [self setBilderListe:dateiListe];
}

/*Die folgende Methode dient der Analyse der Bilder, welche in einem Ordner gefunden wurden. Sie bestimmt das Bildformat und speichert die Bilder als Objekte in die Instanzvariable "bildObjektListe".
Parameter NSArray bilderListe*/
- (void) analysiereBilderListe {
    NSUInteger i, count = [[self bilderListe] count];
    NSMutableArray* neueBildObjektListe = [[NSMutableArray alloc] init];
    for (i = 0; i < count; i++) {
        NSString* bildPfad = [[self bilderListe] objectAtIndex:i];
        NSBitmapImageRep* nsImageRep = [NSBitmapImageRep imageRepWithContentsOfFile:bildPfad];
        NSInteger extrahierteBildHoehe = [nsImageRep pixelsHigh];
        NSNumber* bildHoehe = [NSNumber numberWithInt:extrahierteBildHoehe];
        NSInteger extrahierteBildBreite =[nsImageRep pixelsWide];
        NSNumber* bildBreite = [NSNumber numberWithInt:extrahierteBildBreite];
        Bild* bild = [[Bild alloc] init];
        [bild setVollstaendigerBildName:bildPfad];
        if ((bildHoehe == self.erwarteteBildHoehe) && (bildBreite == self.erwarteteBildBreite)) {
            [bild setBildformat:hochformat];
        } else if ((bildHoehe == self.erwarteteBildBreite) && (bildBreite == self.erwarteteBildHoehe)) {
            [bild setBildformat:querformat];
        } else if (bildHoehe ==bildBreite){
            [bild setBildformat:quadratisch];
        } else {
            continue;
        }
    [neueBildObjektListe insertObject:bild atIndex:i];
    }
    self.bildObjektListe = neueBildObjektListe;
}
@end

与class“图片”:

//Bild.h:

#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>

typedef enum {hochformat, quadratisch, querformat} Bildformat;

@interface Bild : NSObject 
@property (assign) NSString *vollstaendigerBildName;
@property (assign) Bildformat bildformat;

- (Bild*)init;
- (Bild*)init:(NSString *) bildName nunDasBildformat:(Bildformat)dasBildFormat;
- (void)setVollstaendigerBildName:(NSString *) neuerVollstaendigerBildName;
- (NSString *)vollstaendigerBildName;
- (void)setBildformat:(Bildformat) neuesBildformat;
- (Bildformat)bildformat;
@end

//Bild.m:

#import "Bild.h"

@implementation Bild

- (Bild*)init {
    self = [super init];
    if (self){
        self.vollstaendigerBildName = @"";
        self.bildformat = hochformat;
    }
    return self;
}

/*Der explizite Konstruktor dieser Klasse.
 Parameter NSString bildName
 Parameter Bildformat dasBildFormat
 Rueckgabe Bild bild*/
- (Bild*)init:(NSString *)bildName nunDasBildformat:(Bildformat)dasBildFormat {
    self = [super init];
    if (self){
        self.vollstaendigerBildName = bildName;
        self.bildformat = dasBildFormat;
    }
    return self;
}

- (void) setVollstaendigerBildName:(NSString *) neuerVollstaendigerBildName{
    self.vollstaendigerBildName = neuerVollstaendigerBildName;
}

- (NSString *) vollstaendigerBildName{
    return self.vollstaendigerBildName;
}

- (void)setBildformat:(Bildformat) neuesBildformat{
    self.bildformat = neuesBildformat;
}

- (Bildformat)bildformat{
    return self.bildformat;
}
@end

代码在编辑器中没有显示编译错误,但构建结果中有错误:错误消息:

Ld build/Debug/FotobuchErsteller_0 normal x86_64
cd /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/gcc-4.2 -arch x86_64 
-isysroot /Developer/SDKs/MacOSX10.6.sdk         -L/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug     
-F/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug 
-filelist /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/Objects-normal/x86_64/FotobuchErsteller_0.LinkFileList -mmacosx-version-min=10.6 
-framework Foundation -o /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug/FotobuchErsteller_0

Undefined symbols:
  "_OBJC_CLASS_$_NSBitmapImageRep", referenced from:
      objc-class-ref-to-NSBitmapImageRep in BildAnalyst.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

然后我用相同的class“BildAnalyst”尝试了以下方法:

我用过

NSURL* nsUrl = [NSURL fileURLWithPath:bildPfad];
CIImage* nsImageRep = [CIImage imageWithContentsOfURL:nsUrl];

而不是

NSBitmapImageRep* nsImageRep = [NSBitmapImageRep imageRepWithContentsOfFile:bildPfad];

代码在编辑器中没有显示编译错误,但构建结果中有错误:错误消息:

Ld build/Debug/FotobuchErsteller_0 normal x86_64
cd /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/gcc-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk     -L/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug     -F/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug -filelist /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/Objects-normal/x86_64/FotobuchErsteller_0.LinkFileList -mmacosx-version-min=10.6 -framework Foundation -o /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug/FotobuchErsteller_0

Undefined symbols:

"_OBJC_CLASS_$_CIImage", referenced from:
  objc-class-ref-to-CIImage in BildAnalyst.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

然后我用相同的class“BildAnalyst”尝试了以下方法:

我用过

NSURL* nsUrl = [NSURL fileURLWithPath:bildPfad];
NSData* nsData = [NSData dataWithContentsOfURL:nsUrl];
UIImage* nsImageRep = [UIImage imageWithData:nsData];

而不是

NSBitmapImageRep* nsImageRep = [NSBitmapImageRep imageRepWithContentsOfFile:bildPfad];

代码在 UIImage 所在的行显示编译错误。错误消息:

CompileC build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/Objects-normal/x86_64/BildAnalyst.o BildAnalyst.m normal x86_64 objective-c com.apple.compilers.gcc.4_2
cd /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0
setenv LANG en_US.US-ASCII

/Developer/usr/bin/gcc-4.2 -x objective-c -arch x86_64 -fmessage-length=0 -pipe -std=gnu99 -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -isysroot /Developer/SDKs/MacOSX10.6.sdk -mfix-and-continue -mmacosx-version-min=10.6 - gdwarf-2
-iquote /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/FotobuchErsteller_0-generated-files.hmap
-I/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/FotobuchErsteller_0-own-target-headers.hmap
-I/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/FotobuchErsteller_0-all-target-headers.hmap -iquote /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/FotobuchErsteller_0-project-headers.hmap
-F/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug
-I/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/Debug/include
-I/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/DerivedSources/x86_64
-I/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/DerivedSources -include /var/folders/1J/1J8zfhnuH3Gk3T++j4sPBE+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/FotobuchErsteller_0_Prefix-gqjmlqmlzpuhpyfvtxjjyzqdlikg/FotobuchErsteller_0_Prefix.pch -c /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m -o /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/build/FotobuchErsteller_0.build/Debug/FotobuchErsteller_0.build/Objects-normal/x86_64/BildAnalyst.o /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:在函数“-[BildAnalyst analysiereBilderListe]”中: /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112: error: 'UIImage' 未声明(首次在此函数中使用) /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112: error: (每个未声明的标识符只报告一次 /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112:错误:对于它出现的每个函数。) /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112: error: 'nsImageRep' undeclared (首次在此函数中使用) /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:113: 警告:未使用的变量 'bildHoehe' /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:104: 警告: 未使用的变量 'neueBildObjektListe' {标准输入}:未知:未定义的局部符号L_OBJC_CLASSLIST_SUP_REFS_$_0 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_0 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_1 {标准输入}:未知:未定义的局部符号L_OBJC_CLASSLIST_REFERENCES_$_1 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_2 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_3 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_4 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_5 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_6 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_7 {标准输入}:未知:未定义的局部符号 L_OBJC_SELECTOR_REFERENCES_8 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_9 {标准输入}:未知:未定义的局部符号L_OBJC_CLASSLIST_REFERENCES_$_2 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_10 {标准输入}:未知:未定义的局部符号L_OBJC_SELECTOR_REFERENCES_11 {标准输入}:未知:未定义局部符号L_OBJC_SELECTOR_REFERENCES_12

有没有人有什么建议,我可以改进什么或者其他方法?我只想获取保存在本地硬盘驱动器“Macintosh HD”中的图片的宽度和高度作为数字(int、NSInteger、NSNumber、...)。

命令行工具,默认情况下,link 仅针对 Foundation。您需要确保您的项目是针对 AppKit 框架 link 的(或 Cocoa,它会自动 link 到 Foundation 或 AppKit)。 Select 您的项目在 Xcode 中,select 您的目标,然后单击 "Build Phases" 选项卡。在 "Link Binary With Libraries" 中,添加 AppKit。您应该有权访问 AppKit 类 例如 NSImage.