- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前在 OSX 上使用 CoreGraphics 进行了大量工作。
我对我的代码运行了 Time Profiler,发现最大的问题在于 CGContextDrawImage。它是每秒被调用多次的循环的一部分。
我没有任何方法可以优化此代码本身(因为它在 Apple 库中)- 但我想知道是否有更快的替代方法或提高速度的方法。
我在一些混合模式代码之后使用 CGContextDraw 图像,例如:CGContextSetBlendMode(context, kCGBlendModeDifference);
因此替代实现需要能够支持混合。
时间分析器结果:
3658.0ms 15.0% 0.0 CGContextDrawImage
3658.0ms 15.0% 0.0 ripc_DrawImage
3539.0ms 14.5% 0.0 ripc_AcquireImage
3539.0ms 14.5% 0.0 CGSImageDataLock
3539.0ms 14.5% 1.0 img_data_lock
3465.0ms 14.2% 0.0 img_interpolate_read
2308.0ms 9.4% 7.0 resample_band
1932.0ms 7.9% 1932.0 resample_byte_h_3cpp_vector
369.0ms 1.5% 369.0 resample_byte_v_Ncpp_vector
1157.0ms 4.7% 2.0 img_decode_read
1150.0ms 4.7% 8.0 decode_data
863.0ms 3.5% 863.0 decode_swap
267.0ms 1.0% 267.0 decode_byte_8bpc_3
更新:
实际来源大致如下:
/////////////////////////////////////////////////////////////////////////////////////////
- (CGImageRef)createBlendedImage:(CGImageRef)image
secondImage:(CGImageRef)secondImage
blendMode:(CGBlendMode)blendMode
{
// Get the image width and height
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
// Set the frame
CGRect frame = CGRectMake(0, 0, width, height);
// Create context with alpha channel
CGContextRef context = CGBitmapContextCreate(NULL,
width,
height,
CGImageGetBitsPerComponent(image),
CGImageGetBytesPerRow(image),
CGImageGetColorSpace(image),
kCGImageAlphaPremultipliedLast);
if (!context) {
return nil;
}
// Draw the image inside the context
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextDrawImage(context, frame, image);
// Set the blend mode and draw the second image
CGContextSetBlendMode(context, blendMode);
CGContextDrawImage(context, frame, secondImage);
// Get the masked image from the context
CGImageRef blendedImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
return blendedImage;
}
/////////////////////////////////////////////////////////////////////////////////////////
- (CGImageRef)createImageTick
{
// `self.image` and `self.previousImage` are two instance properties (CGImageRefs)
// Create blended image (stage one)
CGImageRef stageOne = [self createBlendedImage:self.image
secondImage:self.previousImage
blendMode:kCGBlendModeXOR];
// Create blended image (stage two) if stage one image is 50% red
CGImageRef stageTwo = nil;
if ([self isImageRed:stageOne]) {
stageTwo = [self createBlendedImage:self.image
secondImage:stageOne
blendMode:kCGBlendModeSourceAtop];
}
// Release intermediate image
CGImageRelease(stageOne);
return stageTwo;
}
最佳答案
@JeremyRoman et al: Thank you so much for your comments. I am drawing the same image a couple of times per loop, onto different contexts with different filters, and combining with new images. Does resampling include switching from RGB to RGBA? What could I try to speed up or eliminate resampling? – Chris Nolet
这就是 Core Image 的用途。查看Core Image Programming Guide了解详情。 CGContext
旨在将最终图像渲染到屏幕上,听起来这并不是您创建的每张图像的目标。
关于objective-c - CGContextDrawImage 的优化替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17787822/
我已经尝试混合两个 UIImage 大约 2 天了,但我收到了一些 BAD_ACCESS 错误。首先,我有两个具有相同方向的图像,基本上我使用 CoreGraphics 进行混合。 一个奇怪的细节,每
我使用时序分析工具确定 95% 的时间都花在调用函数 CGContextDrawImage 上。 在我的应用程序中,有很多重复的图像被重复地从 Sprite map 中截取并绘制到屏幕上。我想知道是否
我正在使用 PhotoScrollerNetwork project为我的项目中的 View 提供单个高分辨率图像并自动平铺它,以便正确管理内存。它使用此代码块将完整的高分辨率图像绘制到内存中,以便可
我正在尝试使用 AVCaptureSession 获取图像。我遵循了本教程 http://www.benjaminloulier.com/posts/2-ios4-and-direct-access-
我正在尝试从 CGImage 创建 CVPixelBufferRef 所以这里是方法: - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef
由于 CGContextDrawImage 可能非常昂贵,因此我在检查像素数据时尽量减少提供给它的数据量。如果我有两个图像和它们交集的 CGRect,我能否让 CGContextDrawImage 仅
我正在尝试比较两个图像(实际上是在较大的图像中找到较小的“子图像”),并且我正在使用下面提供的方法加载图像。 下面的代码现在包含一个测试 for 循环,它总结了所有单独的字节值。我发现这个总和和因此字
我正在尝试制作一个可以使用 CGContextDrawImage(…) 绘制大型(比如 2048 x 1537)图像的一部分的对象。它工作得很好,除了它非常模糊。我正在使用覆盖 drawLayer:i
我有一个自定义 View ,它使用以下方法绘制 CGImage: - (void) drawImage { CGContextRef context = (CGContextRef)[[NSG
我正在使用 Cocoa 和 Xcode4 在 Mac OS X 10.6 上开发 Mac 应用程序,从相机缓冲区获取图像后,我需要获取图像的原始数据。这是代码: - (void)captureOutp
对 GCContextDrawImage 的调用最终成为我的 Mac OS X 应用程序的瓶颈,尤其是在视网膜屏幕上。我设法通过 Avoiding colorspace transformations
在运行了以下代码块之后,我得到了 CGContextDrawImage 的无效上下文 0x0。此代码位于 UIViewController 中的用户定义方法中。我本质上是通过使用 AVFoundati
为什么图像旋转,通过调用CGContextDrawImage。感谢您的帮助。 // Initialization code UIImage *img = [UIImage imageNamed:@"l
有时 CGContextDrawImage 会导致执行以下代码时出现“访问错误”我们无法找到原因。有没有人在使用“CGContextDrawImage”时遇到过同样的错误? let bytes
我使用这段代码缩放和旋转用照相机拍摄的图像。当我使用它时,我可以看到一个巨大的内存峰值。大约 20 MB。当我使用仪器时,我可以看到这一行: CGContextDrawImage(ctxt, orig
我正在尝试编写一个 iPhone 应用程序,它采用 PNG tilesets 并在屏幕上显示它们的片段,并且我试图让它以 20fps 的速度刷新整个屏幕。目前我在模拟器上管理大约 3 或 4fps,在
我目前在 OSX 上使用 CoreGraphics 进行了大量工作。 我对我的代码运行了 Time Profiler,发现最大的问题在于 CGContextDrawImage。它是每秒被调用多次的循环
如何在中心旋转由 CGContextDrawImage() 绘制的图像? 在drawRect: CGContextSaveGState(c); rect = CGRectOffset(rect, -r
我想轻松地将 UIImage 混合到另一个背景图像之上,因此为 UIImage 编写了一个类别方法,改编自 blend two uiimages based on alpha/transparency
我试图制作一个可调整大小的图像,但无法弄清楚这一点。 当我使用 UIImage *bgImage = [[UIImage imageNamed:@"logout-bg"] resizableImage
我是一名优秀的程序员,十分优秀!