2012-07-07 42 views
6

Tôi có một chuỗi NSView ngoài màn hình trong ứng dụng Cocoa, được sử dụng để soạn một tệp PDF để in. Các quan điểm không ở trong một NSWindow, hoặc có thể nhìn thấy trong bất kỳ cách nào.Tạo hình ảnh được chia tỷ lệ từ NSView

Tôi muốn có thể tạo hình thu nhỏ của chế độ xem đó, chính xác như PDF sẽ trông, nhưng được thu nhỏ lại để vừa với kích thước pixel nhất định (bị hạn chế với chiều rộng hoặc chiều cao). Điều này cần phải càng nhanh càng tốt, vì vậy tôi muốn tránh hiển thị cho PDF, sau đó chuyển đổi thành raster và mở rộng quy mô - Tôi muốn chuyển trực tiếp đến raster.

Tại thời điểm tôi đang làm:

NSBitmapImageRep *bitmapImageRep = [pageView bitmapImageRepForCachingDisplayInRect:pageView.bounds]; 
[pageView cacheDisplayInRect:pageView.bounds toBitmapImageRep:bitmapImageRep]; 
NSImage *image = [[NSImage alloc] initWithSize:bitmapImageRep.size]; 
[image addRepresentation:bitmapImageRep]; 

Cách tiếp cận này hoạt động tốt, nhưng tôi không thể làm việc ra làm thế nào để áp dụng một tỉ lệ với NSView trước khi render các bitmapImageRep. Tôi muốn tránh sử dụng scaleUnitSquareToSize, bởi vì khi tôi hiểu nó, chỉ thay đổi giới hạn, chứ không phải khung của NSView.

Bất kỳ đề xuất nào về cách tốt nhất để thực hiện việc này?

Trả lời

6

Đây là những gì tôi đã kết thúc, hoạt động hoàn hảo. Chúng tôi vẽ trực tiếp vào NSBitmapImageRep, nhưng mở rộng ngữ cảnh một cách rõ ràng bằng cách sử dụng CGContextScaleCTM trước. graphicsContext.graphicsPort cấp cho bạn xử lý trên CGContextRef cho số NSGraphicsContext.

NSView *pageView = [self viewForPageIndex:pageIndex]; 

float scale = width/pageView.bounds.size.width; 
float height = scale * pageView.bounds.size.height; 

NSRect targetRect = NSMakeRect(0.0, 0.0, width, height); 
NSBitmapImageRep *bitmapRep; 

bitmapRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 
                pixelsWide:targetRect.size.width 
                pixelsHigh:targetRect.size.height 
               bitsPerSample:8 
               samplesPerPixel:4 
                 hasAlpha:YES 
                 isPlanar:NO 
               colorSpaceName:NSCalibratedRGBColorSpace 
                bitmapFormat:0 
                bytesPerRow:(4 * targetRect.size.width) 
                bitsPerPixel:32]; 

[NSGraphicsContext saveGraphicsState]; 

NSGraphicsContext *graphicsContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapRep]; 
[NSGraphicsContext setCurrentContext:graphicsContext]; 
CGContextScaleCTM(graphicsContext.graphicsPort, scale, scale); 

[pageView displayRectIgnoringOpacity:pageView.bounds inContext:graphicsContext]; 

[NSGraphicsContext restoreGraphicsState]; 

NSImage *image = [[NSImage alloc] initWithSize:bitmapRep.size]; 
[image addRepresentation:bitmapRep]; 

return image; 
+0

Tôi đã sử dụng 'bitmapImageRepForCacheDisplayInRect:' và 'cacheDisplayInRect: toBitmapImageRep:' để tạo hình thu nhỏ động cho ứng dụng sổ ghi chép khi khởi chạy. Với> 40 trang (NSViews lớp được lưu trữ) với nhiều nội dung trực quan, việc tạo hình thu nhỏ đã mất gần 90 giây. Đây không phải là trường hợp trong các phiên bản trước của macOS. Tôi đã thay thế phương pháp này bằng cách tiếp cận @ tomtaylor ở trên, sử dụng thang tỷ lệ 1.0 (vì tôi cần hình thu nhỏ để thu nhỏ trở lên kích thước đầy đủ) và thế hệ hình thu nhỏ giảm xuống 20 giây (nền), với khoảng một nửa dung lượng bộ nhớ ảo! – Dalmazio

0

Làm thế nào để sử dụng scaleUnitSquareToSize: và sau đó đi qua một đường nhỏ hơn vào bitmapImageRepForCachingDisplayInRect:cacheDisplayInRect:toBitmapImageRep:?

Vì vậy, nếu bạn hạ thấp nó xuống theo hệ số 2, bạn sẽ vượt qua trực tràng với một nửa có giới hạn và chiều cao.

+0

Tôi đang sử dụng Hệ thống bố cục văn bản ca cao, cùng với NSTextContainer. Như tôi đã hiểu, điều đó chỉ có thể ở cấp độ NSView. – tomtaylor

+0

Ah, xin lỗi, tôi đã hiểu lầm. Tôi nghĩ bạn đang hiển thị một tệp PDF nhưng bạn đang tạo * một tệp PDF từ các chế độ xem hiện tại. –

+0

Tôi đã thực hiện một số đề xuất mới; Tôi nghĩ rằng kế hoạch của bạn có ý nghĩa. Bạn cũng có thể thử sử dụng chế độ xem được hỗ trợ lớp và sử dụng biến đổi trên lớp đó. (Tôi quen với iOS hơn, nơi đó sẽ là điều tự nhiên để làm.) –

Các vấn đề liên quan