Преобразование NSImage в CIIMAGE без ухудшения качества

StackOverflow https://stackoverflow.com/questions/3731393

  •  03-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь превратить NSImage в CIIMAGE. Когда я делаю это, кажется, огромная потеря в качестве изображения. Я думаю, что это из-за «TIFFrepresentation». У кого-нибудь есть лучший метод? Большое спасибо.

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];
Это было полезно?

Решение 3

Я наконец решил проблему. По сути, я оказываю документ PDF в два раза больше его обычного разрешения, а затем захватить изображение, отображаемое представлением. Для более подробного изображения просто увеличивайте коэффициент масштабирования. Пожалуйста, смотрите код ниже для доказательства концепции. Я не показал CIImage, но, как только вы получите растровое изображение, просто используйте метод CIIMAGE для создания CIIMAGE из растрового изображения.

    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];

Другие советы

Ваша проблема действительно преобразует в TIFF. PDF - это векторный формат, в то время как TIFF представляет собой растровое изображение, поэтому TIFF будет выглядеть размытым при больших размерах.

Ваша лучшая ставка, вероятно, получает CJIMage из NSImage и создать CIIMAGE от этого. Либо это, либо просто создать CIImage из исходных данных.

Попробуйте заменить линию

NSData  * tiffData = [image TIFFRepresentation];

с участием

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

потому что Документация Государства утверждают, что TIFFrePresentation использует вариант сжатия TIFF, связанный с каждым представлением изображения, что может не быть NSTIffcompressionnone. Таким образом, вы должны быть явными о желании Tiffdata несжатых.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top