0

我做什么:我对 Objective-C 很陌生,我在我的旧 Macbook 2,1 上编写了一个命令行应用程序,它可以处理图片。

我的问题:我只想获取保存在本地硬盘“Macintosh HD”上的图片的宽度和高度作为数字(int,NSInteger,NSNumber,...)。

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

我的工作平台:我正在使用 Xcode 3.2.6 在 Mac OS X 10.6.8 上进行开发。

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

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

//图片分析.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

与“图片”类:

//图片.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

//图片.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

然后我用同一个类“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

然后我用同一个类“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/FotobuchSkriptErsteller_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_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/FotobuchSkriptErsteller_0/build/Debug
-I/Users/Edo/Documents/FotobuchSkriptErstellerFotobuchSkriptErsteller/ /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-包括/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 analysiereBilder'中/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112:错误:未声明“UIImage”(首次在此函数中使用)/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller11_02/ :错误:(每个未声明的标识符仅报告一次 /Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller/FotobuchErsteller_0/BildAnalyst.m:112:错误:对于它出现的每个函数。)/Users/Edo/Documents/FotobuchSkriptErsteller/FotobuchSkriptErsteller /FotobuchErsteller_0/BildAnalyst.m:112:错误:“nsImageRep”未声明(在此函数中首次使用)/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_CLASSLIST_SUP_REFS_$_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_CLASSL_REFERENCES_2ERENCES {标准输入}:未知:未定义的本地符号 L_OBJC_SELECTOR_REFERENCES_10 {标准输入}:未知:未定义的本地符号 L_OBJC_SELECTOR_REFERENCES_11 {标准输入}:未知:未定义的本地符号 L_OBJC_SELECTOR_REFERENCES_12未知:未定义的本地符号 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未知:未定义的本地符号 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,...)。

4

1 回答 1

0

默认情况下,命令行工具仅与 Foundation 链接。您需要确保您的项目链接到 AppKit 框架(或 Cocoa,它会自动链接到 Foundation 或 AppKit)。在 Xcode 中选择您的项目,选择您的目标,然后单击“Build Phases”选项卡。在“Link Binary With Libraries”中,添加 AppKit。您应该可以访问 AppKit 类,例如NSImage.

于 2017-09-02T14:52:52.420 回答