Печать NSImage - PullRequest
       14

Печать NSImage

1 голос
/ 16 сентября 2009

Я перевожу код Cocoa-Java на Cocoa + JNI, поскольку Cocoa-Java устарела. Код печатает изображение, хранящееся в файле. Новый код Какао в основном:

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

Почему? Как я могу просто напечатать изображение, которое хранится в файле?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2009
NSImageView *view = [[NSImageView alloc] init];

Это неверно. Вам нужно использовать initWithFrame: для инициализации представления. Возможно, вы захотите передать кадр, состоящий из NSZeroPoint и размера изображения.

Что касается использования setBoundsOrigin: и setBoundsSize:: я не уверен, что они сработают, если вы хотите обрезать изображение. Вы можете попробовать их (после исправления вышеуказанной проблемы), но я чувствовал бы, что безопаснее создать новое изображение из желаемого раздела старого. Это можно сделать, создав пустое изображение нужного размера, заблокировав на нем фокус, нарисовав правильный участок старого изображения в исходной точке нового изображения и разблокировав фокус на новом изображении, а затем предоставив новое изображение вместо старый вид изображения.

0 голосов
/ 16 сентября 2009

Это опечатка во второй раз, когда вы присваиваете p.y? Не похоже, что вы определили info до 2 строк позже ...

Кроме того, не будет ли проще использовать NSMakePoint () и NSMakeSize () , передавая int, вместо того, чтобы создавать их вручную и использовать 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];
}
...