Frage

Ich versuche, eine NSImage zu einem CIImage zu konvertieren. Wenn ich das tue, scheint es ein großer Verlust in der Bildqualität zu sein. Ich denke, es ist wegen der „TIFFRepresentation“ ist. Hat jemand eine bessere Methode hat? Vielen Dank.

NSImage *image = [[NSImage alloc] initWithData:[someSource dataRepresentation]];

NSData  * tiffData = [image TIFFRepresentation];
CIImage *backgroundCIImage = [[CIImage alloc] initWithData:tiffData];

CIContext *ciContext = [[NSGraphicsContext currentContext] CIContext];  
[ciContext drawImage:backgroundCIImage atPoint:CGPointZero fromRect:someRect];
War es hilfreich?

Lösung 3

Ich löste schließlich das Problem. Grundsätzlich ich das PDF-Dokument zweimal seine normale Auflösung außerhalb des Bildschirms machen und dann erfassen das Bild von der Ansicht angezeigt. Für eine detailliertere Bild, erhöht nur den Skalierungsfaktor. Bitte beachten Sie den Code unten für den Proof of Concept. Ich habe nicht den CIImage zeigen aber, sobald Sie die Bitmap zu erhalten, verwenden Sie einfach die CIImage Methode, um die CIImage aus dem Bitmap zu erstellen.

    NSImage *pdfImage = [[NSImage alloc] initWithData:[[aPDFView activePage] dataRepresentation]];
    NSSize size = [pdfImage size];
    NSRect imageRect = NSMakeRect(0, 0, size.width, size.height);
    imageRect.size.width *= 2; //Twice the scale factor
    imageRect.size.height *= 2; //Twice the scale factor

    PDFDocument *pageDocument = [[[PDFDocument alloc] init] autorelease];
    [pageDocument insertPage:[aPDFView activePage] atIndex:0];

    PDFView *pageView = [[[PDFView alloc] init] autorelease];
    [pageView setDocument:pageDocument];
    [pageView setAutoScales:YES];

    NSWindow *offscreenWindow = [[NSWindow alloc] initWithContentRect:imageRect 
                                                            styleMask:NSBorderlessWindowMask
                                                              backing:NSBackingStoreRetained
                                                                defer:NO];

    [offscreenWindow setContentView:pageView];
    [offscreenWindow display];
    [[offscreenWindow contentView] display]; // Draw to the backing buffer

    // Create the NSBitmapImageRep
    [[offscreenWindow contentView] lockFocus];

    NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect];

    // Clean up and delete the window, which is no longer needed.
    [[offscreenWindow contentView] unlockFocus];

    [compositeImage TIFFRepresentation]];
    NSData *imageData = [rep representationUsingType: NSJPEGFileType properties: nil];
    [imageData writeToFile:@"/Users/David/Desktop/out.jpg" atomically: YES];

    [offscreenWindow release];

Andere Tipps

Ihr Problem ist in der Tat die Umwandlung in das TIFF. PDF ist ein Vektorformat, während TIFF Bitmap ist, so dass ein TIFF in größeren Größen sieht verschwommen wird.

Ihre beste Wette ist wahrscheinlich eine CGImage vom NSImage zu erhalten und die CIImage von der erstellen. Entweder das, oder erstellen Sie einfach die CIImage von den ursprünglichen Daten.

Versuchen Sie, die Linie zu ersetzen

NSData  * tiffData = [image TIFFRepresentation];

mit

NSData  * tiffData = [image TIFFRepresentationUsingCompression: NSTIFFCompressionNone factor: 0.0f];

da

scroll top