Я использую следующий код для рендеринга страницы PDF. Однако он использует массу памяти (2-3 МБ на страницу).Как уменьшить использование памяти при рендеринге страницы PDF в CGBitmapContext?
В журналах устройства я вижу:
<Error>: CGBitmapContextInfoCreate: unable to allocate 2851360 bytes for bitmap data
Я действительно не нужно растровое быть оказаны в 8bits на каждый цветовой канал. Как я могу изменить код, чтобы он отображался в оттенках серого или меньше битов на канал?
Я также был бы в порядке с решением, в котором растровое изображение отображается с максимальным разрешением x/y, а затем полученное изображение масштабируется до требуемого размера. В дальнейшем PDF будет подробно отображаться на CATiledLayer
.
Также, согласно документации Apple, CGBitmapContextCreate()
возвращает NIL, если контекст не может быть создан (из-за памяти). Но в MonoTouch есть только конструктор для создания контекста, поэтому я не могу проверить, не было ли создание неудачным или нет. Если бы я был в состоянии, я мог бы просто пропустить изображение претендента.
UIImage oBackgroundImage= null;
using(CGColorSpace oColorSpace = CGColorSpace.CreateDeviceRGB())
// This is the line that is causing the issue.
using(CGBitmapContext oContext = new CGBitmapContext(null, iWidth, iHeight, 8, iWidth * 4, oColorSpace, CGImageAlphaInfo.PremultipliedFirst))
{
// Fill background white.
oContext.SetFillColor(1f, 1f, 1f, 1f);
oContext.FillRect(oTargetRect);
// Calculate the rectangle to fit the page into.
RectangleF oCaptureRect = new RectangleF(0, 0, oTargetRect.Size.Width/fScaleToApply, oTargetRect.Size.Height/fScaleToApply);
// GetDrawingTransform() doesn't scale up, that's why why let it calculate the transformation for a smaller area
// if the current page is smaller than the area we have available (fScaleToApply > 1). Afterwards we scale up again.
CGAffineTransform oDrawingTransform = oPdfPage.GetDrawingTransform(CGPDFBox.Media, oCaptureRect, 0, true);
// Now scale context up to final size.
oContext.ScaleCTM(fScaleToApply, fScaleToApply);
// Concat the PDF transformation.
oContext.ConcatCTM(oDrawingTransform);
// Draw the page.
oContext.InterpolationQuality = CGInterpolationQuality.Medium;
oContext.SetRenderingIntent (CGColorRenderingIntent.Default);
oContext.DrawPDFPage(oPdfPage);
// Capture an image.
using(CGImage oImage = oContext.ToImage())
{
oBackgroundImage = UIImage.FromImage(oImage);
}
}
я сделал интересное открытие: вопрос на IPad 3 только! На iPad 3 b/c с высоким разрешением растровые изображения используют 2,8 МБ ОЗУ. На iPad 1 и 2, то же растровое изображение использует 700k. Я думаю, что в iOS есть проблема - она ДОЛЖНА действительно предупредить меня, но она просто умирает без предупреждения. Я ограничиваю максимальное разрешение растрового изображения до 700k. – Krumelur