1

Monotouch アプリケーションでは、次のコードはページを PDF ドキュメントから UIImage に変換します。動作しますが、PDF ドキュメントが正しく配置されません。

public class KillerLeak
{
    public static void RunOnce()
    {
        using (CGPDFDocument doc = CGPDFDocument.FromFile("DMSWorkbook.pdf"))
        {
            Console.WriteLine("Opened: pages={0}", doc.Pages);

            UIImage img = GetThumbImage(doc, 1000, 1);
            img.Dispose();
        }

        GC.Collect(GC.MaxGeneration);
        GC.WaitForPendingFinalizers();
    }

    private static UIImage GetThumbImage(CGPDFDocument document, float thumbContentSize, int pageNumber)
    {
        if ((pageNumber <= 0) || (pageNumber > document.Pages)) {
            return null;
        }

        // Calc page view size
        SizeF pageSize = new SizeF(768, 1024);
        if (pageSize.Width % 2 > 0) {
            pageSize.Width--;
        }
        if (pageSize.Height % 2 > 0) {
            pageSize.Height--;
        }

        // Calc target size 
        var targetSize = new Size((int)pageSize.Width, (int)pageSize.Height);

        // Draw page on CGImage
        CGImage pageImage;
        using (CGColorSpace rgb = CGColorSpace.CreateDeviceRGB()) {
            using (CGBitmapContext context = new CGBitmapContext(null, targetSize.Width, targetSize.Height, 8, 0, rgb, CGBitmapFlags.ByteOrder32Little | CGBitmapFlags.NoneSkipFirst)) {
                using (CGPDFPage pdfPage = document.GetPage(pageNumber)) {
                    RectangleF thumbRect = new RectangleF(0.0f, 0.0f, targetSize.Width, targetSize.Height);
                    context.SetFillColor(1.0f, 1.0f, 1.0f, 1.0f);
                    context.FillRect(thumbRect);
                    context.ConcatCTM(pdfPage.GetDrawingTransform(CGPDFBox.Crop, thumbRect, 0, true));
                    context.SetRenderingIntent(CGColorRenderingIntent.Default);
                    context.InterpolationQuality = CGInterpolationQuality.Default;
                    context.DrawPDFPage(pdfPage);
                    pageImage = context.ToImage();
                }
            }
        }           
        UIImage result = UIImage.FromImage(pageImage);  
        pageImage.Dispose();
        return result;          
    }
}

DrawPDFPage(...) 行をコメントアウトすると、コードは漏れません。これは Monotouch のバグですか、それとも何か間違っていますか?

4

1 に答える 1

1

私が以前考えていたように、リークは Monotouch とは関係がないことが判明しました。このリークは IOS 5 では発生しませんが、まだベータ版である次のバージョンの IOS ではリークします。Monotouch と Objective-C で記述された同じコードを使用してテストしたところ、どちらも同じ動作を示しました。

于 2012-09-18T13:47:28.070 に答える