NSImage - после обрезки PDF расплывчатый - PullRequest
2 голосов
/ 07 февраля 2009

Я пытаюсь обрезать NSImage, который содержит PDF. При печати я использую drawInRect от NSImage, чтобы он рисовал только то, что мне нужно - и это прекрасно работает.

Но теперь вместо этого я пытаюсь создать новый NSImage только обрезанной области. Я играл с ним некоторое время, затем нашел этот код на CocoaBuilder:

- (NSImage *) imageFromRect: (NSRect) rect
{
  NSAffineTransform * xform = [NSAffineTransform transform];

  // translate reference frame to map rectangle 'rect' into first quadrant
  [xform translateXBy: -rect.origin.x
                  yBy: -rect.origin.y];

  NSSize canvas_size = [xform transformSize: rect.size];

  NSImage * canvas = [[NSImage alloc] initWithSize: canvas_size];
  [canvas lockFocus];

  [xform concat];

  // Get NSImageRep of image
  NSImageRep * rep = [self bestRepresentationForDevice: nil];

  [rep drawAtPoint: NSZeroPoint];

  [canvas unlockFocus];
  return [canvas autorelease];
}

Это работает, но возвращаемый NSImage размыт и больше не подходит для печати. Есть идеи?

Ответы [ 2 ]

5 голосов
/ 07 февраля 2009

lockFocus / unlockFocus выполняет растровое рисование в кэш изображения. Вот почему он «размытый» - это низкое разрешение и, возможно, он не зарегистрирован. Вам нужен векторный рисунок.

Используйте PDF Kit. Сначала установите прямоугольник обрезки каждой страницы. После этого вы сможете создать свой обрезанный NSImage из dataRepresentation PDFDocument.

2 голосов
/ 07 февраля 2009

Вот код для выполнения того, что ответил Питер Хоси. Спасибо!

PDFDocument *thePDF = [[PDFDocument alloc] initWithData:pdfData];
PDFPage *thePage = [thePDF pageAtIndex:0];
NSRect pageCropRect = NSMakeRect(0, 100, 100, 100);

[thePage setBounds:pageCropRect forBox:kPDFDisplayBoxMediaBox];
NSImage *theCroppedImage = [[NSImage alloc] initWithData:[thePage dataRepresentation]];
...