gpt4 book ai didi

objective-c - iPad绘图:将图像绘图到CGContext中

转载 作者:行者123 更新时间:2023-12-01 16:55:38 25 4
gpt4 key购买 nike

在我的iPad绘图应用程序中,我创建了一个768 x 1024的缓冲区上下文,用于加速绘图。

这是调用drawRect时当前正在执行的代码,该代码将我已经存在的图形简单地复制到屏幕上:

CGContextRef context = UIGraphicsGetCurrentContext();

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context);
CGContextDrawImage(context, CGRectMake(0, 0, 768, 1024), image);
CGImageRelease(image);

这段代码按预期工作:从我的背景上下文中收集图像,并将其绘制到当前上下文中,然后释放图像。有用!

但是,我正在做一些性能调整以加快绘图速度,而我尝试使用此代码,其中“rect”是drawRect传递的矩形
CGContextRef context = UIGraphicsGetCurrentContext();

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context);
CGImageRef subImage = CGImageCreateWithImageInRect(image, rect);
CGContextDrawImage(context, rect, subImage);
CGImageRelease(subImage);
CGImageRelease(image);

这行不通;该图像不会出现在正确的位置,甚至可能不是正确的图像(无法分辨,因为该图像是否出现在错误的位置,该图像的一部分甚至都不会绘制,因为它将位于drawRect的外部矩形。)知道发生了什么吗?

下面是我如何初始化[DrawingState sharedState] .context。这部分应该没问题,但我认为为完整起见,我将其包括在内。
if(context != NULL)
{
CGContextRelease(context);
context = NULL;
}
if(bitmapData != NULL)
{
free(bitmapData);
bitmapData = NULL;
}
if(colorSpace != NULL)
{
CGColorSpaceRelease(colorSpace);
colorSpace = NULL;
}

CGSize canvasSize = CGSizeMake(screenWidth, screenHeight);

int bitmapByteCount;
int bitmapBytesPerRow;

bitmapBytesPerRow = (canvasSize.width * 4);
bitmapByteCount = (bitmapBytesPerRow * canvasSize.height);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc( bitmapByteCount );

if( bitmapData == NULL ){
NSLog(@"Buffer could not be alloc'd");
}

//Create the context
context = CGBitmapContextCreate(bitmapData, canvasSize.width, canvasSize.height, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst);

根据要求,我尝试执行的实际优化如下。我正在将缓冲区图像绘制(在进行其他绘制之前)到我的缓冲区上下文中,然后稍后将我的缓冲区上下文复制到当前上下文中。

原始代码:
CGContextClearRect([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024));
if(bufferImage != NULL)
{
CGContextDrawImage([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024), bufferImage);
}

优化代码:
CGContextClearRect([DrawingState sharedState].context, rect);
if(bufferImage != NULL)
{
CGImageRef subImage = CGImageCreateWithImageInRect(bufferImage, rect);
CGContextDrawImage([DrawingState sharedState].context, rect, bufferImage);
CGImageRelease(subImage);
}

最佳答案

我怀疑您想使用相同的rect值来创建子图像和绘图。

如果您阅读the docsCGImageCreateWithImageInRect将使用图像和rect参数的交集,而CGContextDrawImage会将图像绘制为rect。

我看不到您打算如何将其用作优化,但是您的结果听起来像我对您的代码的期望。

关于objective-c - iPad绘图:将图像绘图到CGContext中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12075903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com