簡體   English   中英

我的CGBitmapContext有什么問題?

[英]What's wrong with my CGBitmapContext?

我在python中創建有效的CGBitmapContext有麻煩。 它只是返回null值,這將導致其他所有內容抱怨缺少定義和python崩潰。 我試過將內存分配設置為“無”,這意味着它應該進行自我整理,但這也不起作用。 而且我也不認為objC緩沖區也已分配。 任何幫助將不勝感激。

#!/usr/bin/python

import os, sys, objc
from Quartz import *

os.environ["CG_CONTEXT_SHOW_BACKTRACE"] = '1'
resolution = 300 #dpi
scale = resolution/72

cs = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
# Options might be: kCGImageAlphaNoneSkipLast, kCGImageAlphaPremultipliedLast \ or FIRST
transparency = kCGImageAlphaNoneSkipLast

#Save image to file
def writeImage (image, url, type, options):
    destination = CGImageDestinationCreateWithURL(url, type, 1, None)
    CGImageDestinationAddImage(destination, image, options)
    CGImageDestinationFinalize(destination)
    CFRelease(destination)
    return

if __name__ == '__main__':

    for filename in sys.argv[1:]:
        pdf = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithFilename(filename))
        numPages = CGPDFDocumentGetNumberOfPages(pdf)
        shortName = os.path.splitext(filename)[0]

        # For each page, create a file
        for i in range (1, numPages+1):
            page = CGPDFDocumentGetPage(pdf, i)
            if page:
        #Get mediabox
                mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
                x = CGRectGetWidth(mediaBox)
                y = CGRectGetHeight(mediaBox)
                x *= scale
                y *= scale
        # Allocate Memory, in this day and age.
                try:
                    rasterData = objc.allocateBuffer(int(4 * x * y))
                except  MemoryError: break
        # Create a Bitmap Context
                ctx = CGBitmapContextCreate(rasterData, x, y, 8, x, cs, transparency)
                CGContextSaveGState (ctx)
                CGContextScaleCTM(ctx, scale,scale)
                CGContextDrawPDFPage(ctx, page)
                CGContextRestoreGState(ctx)
        # Convert to an "Image"
                image = CGBitmapContextCreateImage(ctx) 
        # Create unique filename per page
                outFile = shortName + str(i) + ".tiff"
                url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outFile, len(outFile), False)
        # kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG
                type = 'kUTTypeTIFF'
                options = {
                    kCGImagePropertyTIFFXResolution : 300,
                    kCGImagePropertyTIFFYResolution : 300
                    }
                writeImage (image, url, type, options)
                CGContextRelease(ctx)
                del page

輸出表明我打開了一些額外的日志記錄:

os.environ["CG_CONTEXT_SHOW_BACKTRACE"] = '1'
os.environ["CGBITMAP_CONTEXT_LOG_ERRORS"] = '1'

然后,這給了我以下信息,這似乎是蘋果自己的文檔中所缺少的:

CGBitmapContextCreate: unsupported parameter combination:
    16 integer bits/component;
    48 bits/pixel;
    RGB color space model; kCGImageAlphaNone;
    14336 bytes/row.
Valid parameters for RGB color space model are:
    16  bits per pixel,      5  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipLast
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaNoneSkipLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    64  bits per pixel,      16 bits per component,      kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
    128 bits per pixel,      32 bits per component,      kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    128 bits per pixel,      32 bits per component,      kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents

因此,僅將透明度常量更改為kCGImageAlphaPremultipliedLast即可停止崩潰並修復上下文。 但是,整個腳本仍然無法正常工作,我只得到Trace/BPT trap: 5作為響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM