renderInContext,iPhoto图像适用于PDF但不适用于缩略图

时间:2012-08-03 15:03:26

标签: objective-c ios core-graphics

我似乎有一个涉及renderInContext的奇怪错误。

我正在开发一个“剪贴簿”应用程序,它允许人们在剪贴簿视图中自由排列文本,彩色方块和照片。请注意,用户可以添加内置照片集(通过imageNamed :)加载的照片和来自资产库的照片。

我的代码根据需要从剪贴簿视图及其所有子视图创建PDF和缩略图,首先创建PDFContext(对于PDF)或ImageContext(对于缩略图),然后在scrapBookView.layer上调用renderInContext。

一般来说,代码是有效的,我将描述一个例外。在创建PDF时,内置图像和资源库图像都正确地包含在渲染的PDF中。但是,当我创建缩略图时,会显示内置图像,但资产库图像不会正确显示。我知道imageView就在那里,因为在其他地方我将它的背景颜色设置为浅灰色,但图像本身不存在。

我怀疑可能有一个异步元素将图像加载到图像视图中,当图像资源库图像呈现为ImageContext时,图像无法足够快地到达那里。

这可能吗?如果没有,为什么renderInContext在PDFContext中工作得很好但在ImageContext中却不太好?

更重要的是,我怎样才能将我的资产库图像包含在缩略图中。

pdf表示和缩略图都是通过scrapbookView中的方法创建的。代码如下:

创建pdfs:

-(NSData*) pdfRepresentation
{
     //== create a pdf context
     NSMutableData* result = [[NSMutableData alloc] init];
     UIGraphicsBeginPDFContextToData(result, self.bounds, nil);
     UIGraphicsBeginPDFPage();

     //== draw this view into it
     [self.layer renderInContext: UIGraphicsGetCurrentContext()];  // works for asset library images

     //== add a rectangular frame also
     CGContextRef pdf = UIGraphicsGetCurrentContext();
     CGContextAddRect(pdf, self.bounds);
     [[UIColor lightGrayColor] setStroke];
     CGContextStrokePath(pdf);

     //== clean up and return the results
     UIGraphicsEndPDFContext();
     return [result copy];
}

创建缩略图:

-(UIImage*) thumbnailRepresentation
{
     //== create a large bitmapped image context
     CGFloat minSpan = MIN(self.bounds.size.height, self.bounds.size.width);
     CGSize imageSize = CGSizeMake(minSpan, minSpan);
     UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0.0);

     //== draw the current view into the bitmap context
     self.backgroundColor = [UIColor whiteColor];
     [self.layer renderInContext: UIGraphicsGetCurrentContext()];  // doesn't work for asset library images
     self.backgroundColor = [UIColor clearColor];

     //== get the preliminary results
     UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

     //== create a smaller image from this image
     CGFloat thumbnailWidth = 40.0;
     CGFloat scaleFactor = thumbnailWidth / minSpan;
     UIImage* result = [UIImage imageWithCGImage:[image CGImage] scale:scaleFactor orientation:UIImageOrientationUp];

     return result;
}
// btw - seems wasteful to create such a large intermediate image

任何帮助都将不胜感激。

0 个答案:

没有答案