2

我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI,因为 Cocoa-Java 已被弃用。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是:

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile];
if ( [image isValid] ) {
    NSImageView *view = [[NSImageView alloc] init];
    [view setImage:image];
    [view setImageScaling:NSScaleProportionally];

    NSPoint p;
    NSSize s;

    p.x = static_cast<float>( boundsX );
    p.y = static_cast<float>( boundsY );
    [view setBoundsOrigin:p];

    s.width  = static_cast<float>( boundsWidth );
    s.height = static_cast<float>( boundsHeight );
    [view setBoundsSize:s];

    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo];
    [info setHorizontalPagination:NSClipPagination];
    [info setVerticalPagination:NSClipPagination];
    [info setHorizontallyCentered:NO];
    [info setVerticallyCentered:NO];

    p.x = static_cast<float>( boundsX );
    p.y = static_cast<float>( [info paperSize].height - boundsHeight - boundsY );
    [view translateOriginToPoint:p];

    NSPrintOperation *printOp =
        [NSPrintOperation printOperationWithView:view printInfo:info];
    [printOp setShowsPrintPanel:NO];
    [printOp runOperation];
}

运行此代码最终会崩溃:

Thread 0 Crashed:
0   com.apple.AppKit   0x9484ac75 -[NSConcretePrintOperation(NSInternal) _tryToSetCurrentPageNumber:] + 345
1   com.apple.AppKit   0x948d88cf -[NSView(NSPrintingInternal) _printForCurrentOperation] + 524
2   com.apple.AppKit   0x948d85c5 -[NSConcretePrintOperation _renderView] + 358
3   com.apple.AppKit   0x9491f0c0 -[NSConcretePrintOperation runOperation] + 362

为什么?如何简单地打印存储在文件中的图像?

4

2 回答 2

3
NSImageView *view = [[NSImageView alloc] init];

那是无效的。你需要用来initWithFrame:初始化一个视图。您可能需要传递一个由NSZeroPoint和图像大小组成的框架。

至于setBoundsOrigin:and的使用setBoundsSize::假设您要裁剪图像,我不确定它们是否会起作用。您可以尝试它们(在解决上述问题之后),但我会觉得从旧图像的所需部分创建新图像更安全。您可以通过创建所需大小的空图像,锁定焦点,在新图像的原点绘制旧图像的正确部分,并解锁新图像的焦点,然后给出新图像而不是旧的图像视图。

于 2009-09-16T20:25:41.053 回答
-1

这是您第二次分配的错字p.y吗?info直到 2 行之后你才定义...

另外,通过传递整数来使用NSMakePoint()NSMakeSize()不是更简单,而不是手动构造它们并使用NSMakePoint()static_cast<float>吗?这似乎是一种非常 C++ 的方法......

例如,这样的事情可以工作吗?

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile];
if ([image isValid]) {
    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo];
    [info setHorizontalPagination:NSClipPagination];
    [info setVerticalPagination:NSClipPagination];
    [info setHorizontallyCentered:NO];
    [info setVerticallyCentered:NO];

    NSImageView *view = [[NSImageView alloc] init];
    [view setImage:image];
    [view setImageScaling:NSScaleProportionally];
    [view setBoundsOrigin:NSMakePoint(boundsX, boundsY)];
    [view setBoundsSize:NSMakeSize(boundsWidth, boundsHeight)];
    [view translateOriginToPoint:NSMakePoint(boundsX, [info paperSize].height -
                                                      boundsHeight - boundsY)];

    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:view printInfo:info];
    [printOp setShowsPrintPanel:NO];
    [printOp runOperation];
}
于 2009-09-16T17:19:27.527 回答