问题描述
我正在尝试以编程方式在iOS中创建GIF,使用以下堆栈的问题:
I am trying to programmatically create GIF in iOS, using the following stack's question:
我的代码如下所示:
// File Parameters
const void *keys[] = { kCGImagePropertyGIFLoopCount };
const void *values[] = { (CFNumberRef) 0 };
CFDictionaryRef params = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
const void *keys2[] = { kCGImagePropertyGIFDictionary };
const void *values2[] = { (CFDictionaryRef) params };
CFDictionaryRef fileProperties = CFDictionaryCreate(NULL, keys2 , values2, 1, NULL, NULL);
// URL to the documents directory
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:fileName];
// Object that writes GIF to the specified URL
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, [arrayOfAllFrames count], NULL);
CGImageDestinationSetProperties(destination, fileProperties);
for (NSUInteger i = 0; i < [arrayOfAllFrames count]; i++) {
@autoreleasepool {
float delayTime = [[gifFramesDuration objectAtIndex:i] floatValue];
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: [NSNumber numberWithFloat:delayTime] // a float (not double!) in seconds, rounded to centiseconds in the GIF data
}
};
UIImage *myImage = [arrayOfAllFrames objectAtIndex:i];
CGImageDestinationAddImage(destination, myImage.CGImage, (__bridge CFDictionaryRef)frameProperties);
}
}
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
CFRelease(fileProperties);
CFRelease(params);
但是,一旦我尝试向GIF文件添加大约240帧,调试器会抛出以下错误CGImageDestinationFinalize被调用:
However once I try to add around 240 frames to the GIF file, debugger throws the following error once the CGImageDestinationFinalize gets called:
(923,0xb0115000) malloc: *** error for object 0xd1e7204: incorrect checksum for freed object - object was probably modified after being freed.
您能否提供一些解决方法,或者建议如何避免使用malloc?
Could you please provide me with some workaround, or with a suggestion on how to avoid malloc?
推荐答案
首先,尝试使用Instruments调试您的应用程序。您可能会注意到问题是由该方法引起的:
Generatefromrgbimagewu
First of all, try debugging your app using Instruments. You probably will notice that the problem is caused by the method:Generatefromrgbimagewu
我一直想知道原因是否在我的线程实现中,但事实证明,一旦出现这种错误,你应该专注于调整图像的大小。
I have been wondering whether the cause was in my threads implementation, but it turns out, that once you have that kind of error, you should focus on resizing the Image.
图片大小调整后,上面发布的代码将生成您自己的GIF。
Once the image had been resized, the code published above, will generate your own GIF.
这篇关于如何在使用CGImageDestinationFinalize时避免使用malloc的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!