我经历了逐步发现iOS中性能最佳的图像大小调整解决方案的常规过程,最终我得到了ImageIO.
以下效果很好
if let currentImage = CGImageSourceCreateWithData(imageData, nil)
//...some code that extracts the existing size, and based on my maximum expected horizontal size..calculates a new horizontal/vertical maximum size..
let options: CFDictionary = [kCGImageSourceThumbnailMaxPixelSize as NSString : maximumImageWidthOrHeight,
kCGImageSourceCreateThumbnailFromImageAlways as NSString : true]
CGImageSourceCreateThumbnailAtIndex(image, options)
Run Code Online (Sandbox Code Playgroud)
但仅适用于下采样.
如果我的图像是全高清即.1920 x 1080,它被调整大小(保持纵横比),使其适合320 px horizontaly,因为这是我设置为最大水平尺寸.
但是,如果我传入一个16像素×9像素的图像..一个非常小的图像(显然具有16:9的宽高比).此图像未调整大小.
我想将它调整为320 x 180像素.
是否有一个选项组合/一个错过的方法调用/任何会在imageIO框架中给我的东西?
Hug*_*nso 11
的ImageIO被设计成逐渐地加载图像(如在网页中的图像),建立快速 的缩略图(其最大尺寸将是中的一个原始图像),并建立一组缓存的或不是图像.这是手册
最简单的方法是使用UIKit,并使用范围内的比例比(0 <ratio <1).
例如,从16x9图像变为230x180将是:
let image = UIImage(data: yourImageData!, scale: 0.050)!
Run Code Online (Sandbox Code Playgroud)
还有其他方法,如NSHipster所描述的那些稍微复杂但可能值得一看,并进行一些性能测试以选择哪一个更好的上采样.但这要由你来测试.
无论哪种方式,结果都会非常糟糕,因为上采样 仍在研究中并且是一项非常困难的任务.
关于这个主题有几篇论文,但它们通常与对特定类型的对象进行上采样有关,这允许算法做出一些必要的假设,例如: 幻觉面:TensorPatch超分辨率和耦合残差补偿
如果我选择一种方法来实现这一点,质量是我的目标,我会选择超分辨率的OpenCV 算法.
但是,它们是迭代算法,因此可能不符合您的性能需求.
所以,你可能需要重新考虑这个有多重要你的应用程序,也许找到一个解决方法,因为将有没有办法实现两者的品质和接近实时的性能现在.;-)
快乐的编码!
UpSampling Images,一些注释:
(不幸的是,这将用Objective-C编写,部分原因是由于ImageMagick本身的复杂性,它是用C代码编写的,就是这样,没有ObjC或Swift)
ImageMagick的
可能最好的图像模块库之一是ImageMagick,这个库由很多人构建,特别值得注意的是Nicolas Robidoux,他目前是Phase One的高级研究科学家.第一阶段是:
Phase One是开放平台,高端中画幅相机系统和解决方案的全球领导者.我们的产品以其质量,灵活性和速度而闻名,使专业摄影师能够以各种格式进行拍摄.
Nicholas拥有新墨西哥大学的应用数学博士学位,并在ImageMagick工作了一段时间.以下是尼古拉斯关于对图像进行上采样的说法:
http://www.imagemagick.org/Usage/filter/nicolas/#upsampling
推荐的上采样方法(放大) 使用LanczosSharp EWA滤波器通过Sigmoidized色彩空间调整大小的结果是相当模糊的,如果有点模糊.在简答中讨论的内置LanczosSharp效果很好,但我更喜欢使用"-filter Lanczos -define filter:blur = .9891028367558475"获得的去模糊度略低的版本.
convert {input} -colorspace RGB + sigmoidal-contrast 7.5\-filter Lanczos -define filter:blur = .9891028367558475\-distort Resize 500%\ -sigmoidal-contrast 7.5 -colorspace sRGB {output}
使用内置的LanczosSharp滤镜可以获得几乎相同的结果,该滤镜是通过"-filter LanczosSharp"替换"-filter Lanczos -define filter:blur = .9891028367558475"获得的.
哇,这是一些很棒的东西,尼古拉斯告诉我们还有什么:
http://www.imagemagick.org/Usage/filter/nicolas/
调整大小时,I(Nicolas Robidoux)通常会选择张量(正交或2遍)Resize(-resize)运算符滤波器,或者EWA(椭圆加权平均)Distort Resize(-distort Resize)运算符.尽管用于张量和EWA操作的过滤器内核是使用相同的数学函数族构建的,但当与-resize一起使用时以及与-distort Resize一起使用时,它们会产生非常不同的结果.
如果您想为所有内容使用一个单独的过滤器,而宁愿避免颜色空间操作和花式参数等复杂问题,请使用LanczosSharp EWA(椭圆加权平均)滤波器.它会产生稍微模糊的图像,没有锯齿状的说法和相当温和的光晕.
这看起来是半复杂的,所以让我们看看我们可以在IOS中实际上做得很容易,因为一些已经可用的工具保持最新并且是超级友好的IOS.
我们如何在IOS中做到这一点?嗯,如果你想尝试一下,有一个ImageMagick POD,不幸的是它有点难以使用.而且,还有Brad Larson的GPU Image,(感谢Brad !,伟大的图书馆).因此,为了时间的推移,我将坚持使用Brad的GPUImage处理库,让您快速了解"上采样"以及您可以期待的内容.我将使用Shapren和Lanczos过滤器,就像Nicholas建议的那样,不幸的是,据我所知,看起来GPUImage没有专门的"张量"或"LanczosSharp EWA"过滤器,如果我错了,请随时纠正我.那么,说到这里,我们走了:
我将使用这个图像,这是一个简单的"书"图标:
将此图像放在代码中显示以下内容,这是由XCode使用上面"书籍图标"的矢量化PDF提取的未经修改的图像,这里是结果:
没有UPSAMPLING:
UIImage *inputImage = [UIImage imageNamed:@"book"];
cell.imageView.image = inputImage;
Run Code Online (Sandbox Code Playgroud)
LANCZOS UPSAMPLING:
UIImage *inputImage = [UIImage imageNamed:@"book"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageLanczosResamplingFilter *stillImageFilter = [[GPUImageLanczosResamplingFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
[stillImageSource forceProcessingAtSizeRespectingAspectRatio:CGSizeMake(200, 200)];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
cell.imageView.image = currentFilteredVideoFrame;
Run Code Online (Sandbox Code Playgroud)
SHARPEN UPSAMPLING:
UIImage *inputImage = [UIImage imageNamed:@"book"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSharpenFilter *stillImageFilter = [[GPUImageSharpenFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
Run Code Online (Sandbox Code Playgroud)
因此,这可以让您快速了解有关上采样的内容,显然,使用ImageMagick库可能会产生更好的结果,也可能不会产生更好的结果,不幸的是,我没有时间潜水,先让ImageMagick库启动并运行,但是我在帖子中包含的东西可以帮助你找到某种解决方案,尽管这可能是一个半模糊的解决方案,但尽管如此,人类可以根据我们的计算技术和当前的优势解决这个问题.数学.也许有更多的信息比我在这里列出的更近,但是出于所有意图和目的,我觉得我联系的信息将为你提供最好的机会,让你最快到达你想要最快的地方,除非您有时间编写自己的图像库.
无论如何,如果您想尝试在您的应用程序中实现Nicholas的ImageMagick技术,请随时通过安装以下POD来尝试:
pod 'ImageMagick', '6.8.8-9'
Run Code Online (Sandbox Code Playgroud)
对于Brad Larson的GPUImage,POD是:
pod 'GPUImage'
Run Code Online (Sandbox Code Playgroud)
如果您对如何使IOS ImageMagick库工作有疑问:
http://blog.splitwise.com/2012/12/18/imagemagick-for-ios-armv7-and-armv7s/
https://github.com/marforic/imagemagick_lib_iphone
http://www.cloudgoessocial.net/2011/03/21/im-xcode4-ios4-3/
如果你想看看Brad Larson所放的东西,这里是github回购:
https://github.com/BradLarson/GPUImage
为了扩展我的答案,我决定首先跳到ImageMagick头,这是结果,这些结果基于这次的PNG文件,而不是矢量化的PDF文件:
首先,请确保导入此标头:
#import <wand/MagickWand.h>
Run Code Online (Sandbox Code Playgroud)
这是你的财产声明
@property (nonatomic) MagickWand *wand;
Run Code Online (Sandbox Code Playgroud)
并且,你必须做旧的,"viewDidUnlaod"的东西:
-(void)viewDidUnload
{
if (self.wand)
self.wand = DestroyMagickWand(self.wand);
MagickWandTerminus();
}
Run Code Online (Sandbox Code Playgroud)
Lanczos2SharpFilter
MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,100,100,Lanczos2SharpFilter, 2),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;
Run Code Online (Sandbox Code Playgroud)
RobidouxSharpFilter这是尼古拉斯的过滤器
MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,75,75,RobidouxSharpFilter, 1),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;
Run Code Online (Sandbox Code Playgroud)
LanczosSharpFilter
MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,75,75,LanczosSharpFilter, 1),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;
Run Code Online (Sandbox Code Playgroud)
我显然可以继续沿着这条路前进,但我现在要由你决定.祝你好运,这里列出了你可以"轻松"使用ImageMagick的所有过滤器;
UndefinedFilter,PointFilter,BoxFilter,TriangleFilter,
HermiteFilter,HanningFilter,HammingFilter,BlackmanFilter,
GaussianFilter,QuadraticFilter,CubicFilter,CatromFilter,
MitchellFilter,JincFilter,SincFilter,SincFastFilter,
KaiserFilter,WelshFilter,ParzenFilter,BohmanFilter,
BartlettFilter,LagrangeFilter,LanczosFilter,
LanczosSharpFilter,Lanczos2Filter, Lanczos2SharpFilter,
RobidouxFilter,RobidouxSharpFilter,CosineFilter,SplineFilter,LanczosRadiusFilter,SentinelFilter
归档时间: |
|
查看次数: |
2174 次 |
最近记录: |