2013-01-08 132 views
0

我是新来的可可和编程,抱歉,如果这是基本的东西。cocoa nsimage没有保存

我正在使用ARC。我有一个由DropZone类控制的NSImageView组件。我拖动&将一个图像放入它,但是一旦我尝试调用我得到的缩放方法,它告诉我“:ImageIO:CGImageSourceCreateWithData数据参数为零”我假设我做错了什么,只是不知道什么呢。

这是我在DropZone.m方法

- (void)scaleIcons:(NSString *)outputPath{ 
NSImage *anImage; 
NSSize imageSize; 
NSString *finalPath; 

anImage = [[NSImage alloc]init]; 
anImage = 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]; 
} 

的DropZone.h

@interface DropZone : NSImageView <NSDraggingDestination>{ 
    NSImage *image; 
} 
- (void)scaleIcons:(NSString *)outputPath; 
@end 

而这里的我怎么称呼它,它我AppDelegate.m

- (IBAction)createIconButtonClicked:(id)sender { 
NSFileManager *filemgr; 
NSString *tempDir; 

filemgr = [NSFileManager defaultManager]; 
tempDir = [pathString stringByAppendingString:@"/icon.iconset"]; 
NSURL *newDir = [NSURL fileURLWithPath:tempDir]; 
[filemgr createDirectoryAtURL: newDir withIntermediateDirectories:YES attributes: nil error:nil]; 
DropZone *myZone = [[DropZone alloc] init]; 
[myZone scaleIcons:tempDir]; 

NSAlert *alert = [[NSAlert alloc] init]; 
[alert setMessageText:@"Done!"]; 
[alert runModal]; 
} 

图像得到的从巴巴拉拉:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender{ 
if ([NSImage canInitWithPasteboard:[sender draggingPasteboard]]) { 
    image = [[NSImage alloc]initWithPasteboard:[sender draggingPasteboard]]; 
    [self setImage:image]; 
    [self setImageAlignment: NSImageAlignCenter]; 
    } 
return YES; 
} 

由于某种原因我的“形象”迷路了。有人可以帮忙吗?

+0

这条线是什么:anImage = image;图像从哪里来? – rdelmar

+0

图片来自粘贴板。在问题中添加了该方法。 – Rokas

回答

1

问题是,您在应用程序委托中创建了DropZone的新实例,但我假设您在IB中创建了图像视图并将其类更改为DropZone。那是对的吗?如果是这样,你需要有一个IBOutlet在连接到IB的图像视图的应用程序委托,并有这样的:

[self.iv scaleIcons:tempDir]; 

其中IV是我的IBOutlet中。

+0

你说得对。我将NSImageView添加到我的.xib中,并将其类改为“DropZone”。 我从图像视图添加了应用程序委托的插座,但现在它说:“未知类型名称'DropZone'”我在这里做错了什么? @property(弱)IBOutlet DropZone * myImageView; – Rokas

+0

@Rokas你需要添加一个“@class DropZone;”位于.h文件的顶部(位于“@interface行”之上)。 – rdelmar

+0

非常感谢您的帮助!学到了很多!我知道什么是错误的:)除了我需要看看我的缩放算法的事实,它看起来像,我的程序现在正在保存图像!:)再次感谢! – Rokas

0

不知道这里的“图像”从何而来,我会说你的问题是在这些线路...

anImage = [[NSImage alloc]init]; 
anImage = image; 

你应该只抓住从ImageView的图像...

anImage = [myImageView image]; 
+0

刚刚尝试过您的方法,错误仍然相同“:ImageIO:CGImageSourceCreateWithData数据参数为零”。 添加了从粘贴板获取图像到问题的方法。 – Rokas