【问题标题】:UIImage from CIImage - Data length is zero?来自 CIImage 的 UIImage - 数据长度为零?
【发布时间】:2013-02-25 23:38:44
【问题描述】:

我正在使用AVCaptureVideoDataOutput 及其委托方法来操作视频帧。在委托方法中,我使用sampleBuffer 创建CIImage,并从这里裁剪CIImage,将其转换为UIImage 并显示它。不幸的是,我需要确定这个新UIImage 的文件大小,但它会返回0。代码有效,图像裁剪精美,一切。我只是不明白为什么它没有数据!

为什么会这样?相关代码如下:

//In delegate method, given sampleBuffer...
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault,
                                  sampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer 
                                                  options:(NSDictionary *)attachments];

...


dispatch_async(dispatch_get_main_queue(), ^(void) {
    CGRect rect = [self drawFaceBoxesForFeatures:features forVideoBox:clap
                                                 orientation:curDeviceOrientation];

    CIImage *cropped = [ciImage imageByCroppingToRect:rect];
    UIImage *image = [[UIImage alloc] initWithCIImage:cropped];

    NSData *data = UIImageJPEGRepresentation(image, 1);
    NSLog(@"Image size is %d", data.length); //returns 0???

    [imageView setImage:image];

    [image release];
});

【问题讨论】:

  • 只是一个 NB - data.length 返回一个无符号整数,因此您的 NSLog 语句应该如下所示:NSLog(@"Image size is %u", data.length)
  • 这是真的 - 尽管它对输出没有影响。我正在尝试筛选 Apple 的文档,只是因为我知道 CoreImage 实际上不是图像,只是数据表示。但在这一点上,我无法理解为什么它在转换时没有数据..
  • 是的,恐怕我被你的实际问题难住了——假设当你在调用UIImageJPEGRepresentation 后断点时,你的NSData 对象实际上有数据。
  • 好吧,进一步测试没有 - NSData 对象中不存在数据。但是我在UIImageView 中的每一帧都显示了正确裁剪的图像,这让我很困惑。转换为UIImage 显示没有问题,但没有数据。
  • 你不必为UIImageJPEGRepresentation而不是CIImage使用CGImage吗?但即使 CIImage 有效,代码也不会是:NSData *data = UIImageJPEGRepresentation(image.CIImage, 1);

标签: objective-c cocoa-touch uiimage core-image


【解决方案1】:

我遇到了同样的问题,但只是过滤了简单的图像。

我偶然发现了this,它解决了这个问题。在此之后,我能够保存我的图像。

CGSize size = self.originalImage.size;
CGRect rect;
rect.origin = CGPointZero;
rect.size   = size;

UIGraphicsBeginImageContext(size);
[[UIImage imageWithCIImage:self.filteredImage] drawInRect:rect];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData * jpegData = UIImageJPEGRepresentation(image, 1.0);

但我只需要“ImageContext”中的这两行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2011-10-20
    相关资源
    最近更新 更多