2009-12-20 93 views
1

我正在为iphone创建图像编辑应用程序。我想让用户从光盘库中选择一个图像,编辑它(灰度,棕褐色等),如果可能的话,保存回文件系统。我已经完成了选择图像(最简单的事情,如你知道使用imagepicker),也用于创建灰度图像。但是,我被卡住了。我不知道如何实现。是否有可能获得图像的每个像素的值,以便我们可以改变它以获得所需的效果。或者有其他可能的方法吗?请帮助...使用iphone编辑图像

回答

1

苹果图像选择器代码将最有可能保存在RAM中的图像的文件名和一些低分辨率渲染直到用户选择图像的最后一刻。

当你问对图像的全帧缓冲区,CPU突然有做了很多工作,在全分辨率解码图像,但此引发其关闭它可能会更简单:

CFDataRef CopyImagePixels(CGImageRef inImage) 
{ 
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
} 

/* IN MAIN APPLICATION FLOW - but see EDIT 2 below */ 
const char* pixels = [[((NSData*)CopyImagePixels([myImage CGImage])) 
    autorelease] bytes]; /* N.B. returned pixel buffer would be read-only */ 

这只是一个猜测,它是如何工作的,真的,但基于一些在其他情况下的图像处理经验。要计算出我的建议是否合理,并且从内存使用的角度来看是好的,请运行Instruments。

苹果文档说(相关,可能适用于您):

您应避免创建大小大于1024×1024的UIImage对象。除了这种图像消耗的大量内存之外,在OpenGL ES中将图像用作纹理时或将图像绘制到视图或图层时,您可能会遇到问题。如果您正在执行基于代码的操作,例如通过将图形绘制到位图支持的图形上下文来调整大于1024 x 1024像素的图像,则此大小限制不适用。实际上,您可能需要以这种方式调整图像大小(或将其分成几个较小的图像),以便将其绘制到您的某个视图中。 [http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html]

AND

注意:在此之前iPhone OS 3.0,UIView的实例可具有的最大高度和1024×1024宽在iPhone OS 3.0和更高版本,视图不再限定于该最大大小,但仍受限于其消耗的内存量。因此,保持视图尺寸尽可能小是符合您的最佳利益。无论哪个版本的iPhone OS正在运行,如果您需要创建尺寸大于1024 x 1024的视图,则应考虑使用CATiledLayer对象。 [http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html]

另外值得一提的是: -

(一)官方如何对

http://developer.apple.com/iphone/library/qa/qa2007/qa1509.html

(b)从http://cameras.about.com/od/cameraphonespdas/fr/apple-iphone.htm

“图像大小上传到你的电脑是1600x1200,但如果您直接从iPhone发送照片,尺寸将减少到640x480。“ (c)使用JPEG图像压缩对大图像进行编码需要大量的RAM,具体取决于大小,可能比应用程序可用的数量大。 (d)有可能使用备用压缩算法(必要时)将其malloc重新连线以使用临时内存映射文件。但请考虑数据隐私/安全问题。

(e)从iPhone SDK: After a certain number of characters entered, the animation just won't load

“我认为这可能是一个层的大小问题,因为iPhone拥有1024×1024的纹理大小限制(在此之后,你需要使用CATiledLayer来备份你的UIView)但我能够制作出宽度超过1024像素的文字,并且仍然有这项工作。“

有时候1024像素限制看起来可能有点软,但我总是建议你防御性地编程,如果可以的话,保持在1024像素限制内。

编辑1

在代码中增加了额外的换行符。

编辑2

哎呀!该代码获取数据的只读副本(CFMutableDataRef和CFDataRef之间存在差异)。由于可用RAM的限制,您必须通过自行平滑缩放来制作较低分辨率的副本,或将其复制到可修改的缓冲区中(如果图像很大),则可能需要将其写入波段到临时文件,释放不可修改的数据块并从文件加载数据。只有这样做,当然如果有这样的临时文件中的数据是可以接受的。痛苦。

编辑3

这里也许是一个更好的主意使用使用CFData块是内存映射CFData目标位图背景也许尝试。那样有用吗?如果您对通过临时文件进行的数据感到满意,只需再次执行此操作。

EDIT 4

哦,不,看来内存映射的读写CFData不可用。也许尝试mmap BSD API。

EDIT 5

增加了 “为const char *” 和 “像素只读” 代码注释。