首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的CGBitmapContext怎么了?

我的CGBitmapContext怎么了?
EN

Stack Overflow用户
提问于 2016-08-19 01:06:46
回答 1查看 199关注 0票数 0

我在python中创建有效的CGBitmapContext时遇到了问题。它只是返回null值,这会导致其他一切都抱怨缺乏定义和python崩溃。我尝试将内存分配设置为None,这意味着它应该会自动排序,但这也不起作用。而且我认为objC缓冲区也没有被分配。任何帮助都将不胜感激。

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

发布于 2016-08-19 15:58:39

输出建议我打开一些额外的日志记录:

代码语言:javascript
复制
os.environ["CG_CONTEXT_SHOW_BACKTRACE"] = '1'
os.environ["CGBITMAP_CONTEXT_LOG_ERRORS"] = '1'

这给了我以下信息,这些信息似乎是苹果自己的文档中所缺少的:

代码语言:javascript
复制
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作为响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39023856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档