Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
使用iphone进行图像编辑_Iphone_Image Processing - Fatal编程技术网

使用iphone进行图像编辑

使用iphone进行图像编辑,iphone,image-processing,Iphone,Image Processing,我正在为iphone创建一个图像编辑应用程序。我想让用户能够从photolibrary中选择一个图像,编辑它(灰度、深褐色等),如果可能的话,保存回文件系统。我这样做是为了拾取图像(最简单的事情,正如你所知道的使用imagepicker)和创建灰度图像。但是,我被深褐色困住了。我不知道如何实现这一点。是否有可能获得图像每个像素的值,以便我们可以改变它以获得所需的效果。还有其他可能的方法吗???请帮助…苹果图像选择器代码很可能只保存文件名和RAM中图像的一些低分辨率渲染,直到用户选择图像的最后一刻

我正在为iphone创建一个图像编辑应用程序。我想让用户能够从photolibrary中选择一个图像,编辑它(灰度、深褐色等),如果可能的话,保存回文件系统。我这样做是为了拾取图像(最简单的事情,正如你所知道的使用imagepicker)和创建灰度图像。但是,我被深褐色困住了。我不知道如何实现这一点。是否有可能获得图像每个像素的值,以便我们可以改变它以获得所需的效果。还有其他可能的方法吗???请帮助…

苹果图像选择器代码很可能只保存文件名和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 x 1024的UIImage对象。除了这样的图像会消耗大量内存之外,在OpenGL ES中将图像用作纹理或将图像绘制到视图或图层时,您可能会遇到问题。如果正在执行基于代码的操作,例如通过将图像绘制到位图支持的图形上下文来调整大于1024 x 1024像素的图像的大小,则此大小限制不适用。事实上,您可能需要以这种方式调整图像的大小(或将其拆分为多个较小的图像),以便将其绘制到某个视图中。 []

注意:在iPhone OS 3.0之前,UIView实例的最大高度和宽度可能为1024 x 1024。在iPhoneOS3.0及更高版本中,视图不再局限于此最大大小,但仍然受到它们所消耗内存量的限制。因此,保持视图大小尽可能小符合您的最佳利益。不管iPhone操作系统的版本是什么,如果需要创建大于1024×1024的视图大小,就应该考虑使用CATIDELL层对象。 []

还值得注意的是:-

(a) 官方指南

(b) 从

上载到计算机的图像大小为1600x1200,但如果您直接从iPhone通过电子邮件发送照片,则图像大小将减小到640x480

(c) 使用JPEG图像压缩编码大型图像需要大量RAM,具体取决于大小,可能比应用程序可用的内存量大

(d) 可以使用一种替代的压缩算法(如有必要)将其malloc重新布线以使用临时内存映射文件。但是考虑数据隐私/安全问题。

(e) 从

“我认为这可能是一个图层大小问题,因为iPhone有1024 x 1024的纹理大小限制(之后需要使用CATiledLayer来支持UIView),但我能够将文本布局得比1024像素宽,并且仍然可以完成这项工作。”

有时1024像素的限制似乎有点软,但我始终建议您进行防御性编程,如果可以的话,请保持在1024像素的限制范围内

编辑1

添加了额外的换行代码

编辑2

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

编辑3

这里可能有一个更好的主意,可以尝试使用目标位图上下文,该上下文使用一个CFData块,该块是内存映射的CFData。这样行吗?同样,只有当您对通过临时文件传输的数据感到满意时,才可以这样做

编辑4

哦,不,似乎内存映射的读写CFData不可用。也许可以试试mmap BSD API

编辑5


在代码中添加了“const char*”和“pixels read-only”注释。

苹果图像选择器代码很可能只保存文件名和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 x 1024的UIImage对象。除了这样的图像会消耗大量内存之外,在OpenGL ES中将图像用作纹理或将图像绘制到视图或图层时,您可能会遇到问题。如果正在执行基于代码的操作,例如通过将图像绘制到位图支持的图形上下文来调整大于1024 x 1024像素的图像的大小,则此大小限制不适用。事实上,您可能需要以这种方式调整图像的大小(或将其拆分为多个较小的图像),以便将其绘制到某个视图中。 []

注意:在iPhone OS 3.0之前,UIView实例的最大高度和宽度可能为1024 x 1024。在iPhone OS 3.0及更高版本中,视图不再限于此最大大小,但仍受内存量的限制