是否可以以编程方式在可可中打印IKImageBrowserView? [英] Is it possible to print IKImageBrowserView In Cocoa programmatically?

查看:55
本文介绍了是否可以以编程方式在可可中打印IKImageBrowserView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用(内容)图像打印IKImageBrowserView.我尝试了以下代码

I want to take print of IKImageBrowserView with (content) images. I tried the following code

if (code == NSOKButton) {
        NSPrintInfo *printInfo;
        NSPrintInfo *sharedInfo;
        NSPrintOperation *printOp;
        NSMutableDictionary *printInfoDict;
        NSMutableDictionary *sharedDict;

        sharedInfo = [NSPrintInfo sharedPrintInfo];
        sharedDict = [sharedInfo dictionary];
        printInfoDict = [NSMutableDictionary dictionaryWithDictionary: sharedDict];

        [printInfoDict setObject:NSPrintSaveJob
                          forKey:NSPrintJobDisposition];

        [printInfoDict setObject:[sheet filename] forKey:NSPrintSavePath];

        printInfo = [[NSPrintInfo alloc] initWithDictionary:printInfoDict];
        [printInfo setHorizontalPagination: NSAutoPagination];
        [printInfo setVerticalPagination: NSAutoPagination];
        [printInfo setVerticallyCentered:NO];

        printOp = [NSPrintOperation printOperationWithView:imageBrowser
                                                 printInfo:printInfo];

        [printOp setShowsProgressPanel:NO];
        [printOp runOperation];
    }

因为 IKImageBrowserView 是从 NSView 继承的,但是打印预览显示空图像.请帮助我解决这个问题.预先感谢.....

because IKImageBrowserView is Inherits from NSView but print preview is showing null image. Please help me to over come this problem. Thanks in advance.....

推荐答案

/*
    1) allocate a c buffer at the size of the  visible rect of the image
    browser
     */
    NSRect vRect = [imageBrowser visibleRect];
    NSSize size = vRect.size;
    NSLog(@"Size W = %f and H = %f", size.width, size.height);
    void *buffer = malloc(size.width * size.height * 4);

//2) read the pixels using openGL
[imageBrowser lockFocus];
glReadPixels(0,
             0,
             size.width,
             size.height,
             GL_RGBA,
             GL_UNSIGNED_BYTE,
             buffer);
[imageBrowser unlockFocus];

//3) create a bitmap with those pixels
unsigned char *planes[2];
planes[0] = (unsigned char *) (buffer);

NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc]
                              initWithBitmapDataPlanes:planes pixelsWide:size.width
                              pixelsHigh:size.height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES
                              isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bitmapFormat:0
                              bytesPerRow:size.width*4 bitsPerPixel:32];
/*
4) create a temporary image with this bitmap and set it flipped
(because openGL and the AppKit don't have the same pixels coordinate
 system)
 */
NSImage *img = [[NSImage alloc] initWithSize:size];
[img addRepresentation:imageRep];
[img setFlipped:YES];
[imageRep release];
/*
5) draw this temporary image into another image so that we get an
image without any reference to our "buffer" buffer so that we can
release it after that
 */
NSImage *finalImage = [[NSImage alloc] initWithSize:size];
[finalImage lockFocus];
[img drawAtPoint:NSZeroPoint
        fromRect:NSMakeRect(0,0,size.width,size.height)
       operation:NSCompositeCopy fraction:1.0];
[finalImage unlockFocus];

//[NSString stringWithFormat:@"/tmp/%@.tiff", marker]
NSData *imageData = [finalImage TIFFRepresentation];
NSString *writeToFileName = [NSString stringWithFormat:@"/Users/Desktop/%@.png", [NSDate date]];
[imageData writeToFile:writeToFileName atomically:NO];

//6) release intermediate objects
[img release];
free(buffer);

此后,我发送imageData进行打印,这对我来说非常有用.

After this I send imageData for print, which works great for me.

这篇关于是否可以以编程方式在可可中打印IKImageBrowserView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆