获取字节后,CGImageDestination压缩的CGImage被截断

时间:2012-04-20 16:17:44

标签: macos core-foundation cgimage cfdata

我想从CGImageRef获取压缩数据,以通过网络连接发送它。 为此,我使用CGImageDestinationRef(CGImageDestinationCreateWithData)。

从CFDataRef对象中拉出数据后,图像底部错过了几行。

这是我做的事情(为了阅读目的而清理......):

CFImageRef image = getTheImageRefIWant();

CFMutableDataRef pngData = CFDataCreateMutable (kCFAllocatorDefault, 0);    

CGImageDestinationRef dataDest = CGImageDestinationCreateWithData (pngData, kUTTypePNG, 1, NULL);

CGImageDestinationAddImage (dataDest, image, NULL); //also tried this with options...

CGImageDestinationFinalize (dataDest);

CFIndex len = CFDataGetLength(pngData);

//copy data
unsigned char* m_image = malloc(len);
CFDataGetBytes (pngData, CFRangeMake(0,len), m_image);

//save data - for testing purpose
FILE *file = fopen("/path/test.png", "wb");
fwrite(m_image, 1, len, file);

//adding header and stuff - skipped here...

//send data
send(sockfd, m_image, len, 0);

如果我使用CFData对象作为NSData对象并将其保存到磁盘,它确实有效:

NSData *data = [(NSData *)pngData autorelease];
[data writeToFile:@"/path/test.png" atomically:YES];

但是如果使用NSDatas字节方法,则它是相同的(截断图像):

NSUInteger len = [data length];
m_image = malloc(len);
memcpy(m_image, (unsigned char*)[data bytes], len);

似乎CFData Object中的数据似乎没问题。 但是如何正确获取字节?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

写完文件后,您是fflush()编辑还是fclose()?您的数据可能只是缓存在内存中。