Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中多种图像格式之间的转换_Objective C_Cocoa_Image_Macos_Image Conversion - Fatal编程技术网

Objective-C中多种图像格式之间的转换

Objective-C中多种图像格式之间的转换,objective-c,cocoa,image,macos,image-conversion,Objective C,Cocoa,Image,Macos,Image Conversion,我希望能够,给定一个图像的路径,将该图像转换为另一个图像,但格式不同。所谓格式,我指的是伪代码中的.png、.bmp.jpg.tiff等格式,这非常简单: image = [ImageAPI open: imagePath] [image save: imagePath withFormat: IMAGEFORMAT] // this is important 不过我不知道怎么做。在处理图像方面,我只知道NSImage类),而这似乎并没有解决我的问题(没有像这样简单的保存方法)。以下是我希望支

我希望能够,给定一个图像的路径,将该图像转换为另一个图像,但格式不同。所谓格式,我指的是伪代码中的.png、.bmp.jpg.tiff等格式,这非常简单:

image = [ImageAPI open: imagePath]
[image save: imagePath withFormat: IMAGEFORMAT] // this is important
不过我不知道怎么做。在处理图像方面,我只知道NSImage类),而这似乎并没有解决我的问题(没有像这样简单的保存方法)。以下是我希望支持的格式列表:

  • .png
  • 蒂芙先生
  • .gif
  • .jpeg
  • .bmp
  • 可能是.pdf(如果不是很复杂的话)
所谓支持,我指的是打开其中任何一种格式,并将打开的图像保存为其中任何一种格式。这里有一些组合(我想是15°?),所以我可以为每个组合编写一个方法,如下所示:

[self saveTiffImageIntoGifWithPath: path] (*15 !!!)
但从防御性角度来说,使用API更好

如果有任何机会,我也有如下选择:

  • 是否保留alpha
  • 调整图像大小
…我也很乐意支持他们,尽管他们是可选的。 我真的希望有一个简单的方法来做到这一点。谢谢

PS:我知道关于这个话题有一些问题,但它们都是面向iPhone的(我想在mac上这样做),没有一个提供了一种使用多种格式的方法。

从外部探索会让你找到,这正是你想要的


其中一些iPhone问题也是相关的,因为在这两种平台上都可以使用的解决方案(以及现在NSBitmapImageRep解决方案背后的实现)是用来读取图像并将其写出。

好吧,在Peter的帮助下,我可以解决这个问题。首先,如果您正在使用图像路径,则直接使用NSData打开文件,如下所示:

NSData* imgData = [NSData dataWithContentsOfFile: filePath];
如果您正在使用NSImage对象,并且很难获得路径(例如使用NSImageView),请执行此操作(图像是您拥有的NSImage对象):

现在已将图像放入NSData对象中,请将其放入NSBitmapImageRep:

NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: imgData];
然后获取一个新的NSData对象,但格式不同:

NSData* newData = [bitmap representationUsingType: NSPNGFileType properties: nil];
// I used NSPNGFileType as an example, but all the
// types I wanted to convert between (except PDF) are supported
最后,将新数据保存到文件中:

[newData writeToFile: newPath atomically: YES]
很简单,一旦你了解了它的工作原理


对透明度和大小控制的支持也没有那么困难:

  • NSImage类支持设置图像大小(-setSize:)
  • NSImageRep(NSBitmapImageRep的超类)具有-setAlpha:方法

你需要的时候就打电话给他们+一杯可可

好吧,NSBitmapImageRep似乎在进行转换(
representationUsingType:properties:
),但我真的不知道如何保存图像!我用NSImage加载图像,使用
[NSBitmapImageRep representationUsingType:properties://添加一个表示,然后呢?!?没有像
saveImageToPath
这样的保存方法。我一定错过了一些很明显的东西…哦。。。我想这次我拿到了。请检查此项:我使用NSData打开原始图像,将数据传递到
[NSBitmapImageRep initWithData://code>,调用
[NSBitmapImageRep representationUsingType:properties://code>,然后将结果数据写入文件。瞧!是这个吗?最好是这样,否则我会很困惑的。我现在不能测试它,所以我要问。PS:如果是这样的话,那么解决方案真的很明显…:)@亚历克斯·特鲁佩尔:是的,尽管NSBitmapImageRep允许您直接从文件内容创建一个。(别忘了查看超类!)这做了很多不必要的工作。无需将文件导出到TIFF即可将其导出为PNG。当您有文件路径或文件内容的数据时,创建NSBitmapImageRep只需一步,然后您就可以直接从中创建PNG数据了。@peter是的,我知道。但是想象一下,我正在使用NSImageView。它不提供路径,只提供NSImage对象,因此在这种情况下,您需要将NSImage转换为NSData,这是我找到的唯一方法。当然,不然!不要使用NSImage,像你说的那样用NSData打开。或者当你有路径时,直接从文件中打开。如果你曾经有过一条路,为什么不保留它呢?您不应该在视图中存储模型;将其传递给视图仅供视图使用。控制器应始终保持原始图像的路径不变。如果这是一个基于文档的应用程序,它无论如何都会这样做;如果没有,你必须,而且你应该自己做。
[newData writeToFile: newPath atomically: YES]