我在python中创建有效的CGBitmapContext时遇到了问题。它只是返回null值,这会导致其他一切都抱怨缺乏定义和python崩溃。我尝试将内存分配设置为None,这意味着它应该会自动排序,但这也不起作用。而且我认为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发布于 2016-08-19 15:58:39
输出建议我打开一些额外的日志记录:
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作为响应。
https://stackoverflow.com/questions/39023856
复制相似问题