2011-10-05 36 views
7

Nếu tôi tạo ra một NSImage qua một cái gì đó như:Đang cố gắng để biến [NSImage imageNamed: NSImageNameUser] vào NSData

NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 

nó chỉ có một đại diện, một NSCoreUIImageRep mà có vẻ là một lớp riêng.

Tôi muốn lưu trữ hình ảnh này như một NSData nhưng nếu tôi yêu cầu các TIFFRepresentation tôi nhận được một biểu tượng nhỏ khi thực NSImage tôi ban đầu được tạo ra dường như là vector và sẽ mở rộng quy mô để điền vào xem hình ảnh của tôi độc đáo.

Tôi đã hy vọng những hình ảnh được thực hiện theo cách này sẽ có một NSPDFImageRep Tôi có thể sử dụng.

Bất kỳ ý tưởng nào về cách tôi có thể nhận được NSData (pref phiên bản vectơ hoặc tệ hơn một phiên bản bitmap tỷ lệ lớn) của số NSImage này?

CẬP NHẬT

đã nói chuyện với một số người on Twitter và họ cho rằng nguồn gốc thực sự của những hình ảnh này là đa độ phân giải ICNS file (có lẽ không vector tại tất cả). Tôi không thể tìm thấy vị trí của chúng trên đĩa nhưng thú vị để nghe không-ít hơn.

Ngoài ra, họ đề nghị tôi tạo hệ thống NSImage và tự hiển thị nó thành NSImage có độ phân giải cao của riêng tôi. Tôi đang làm điều này bây giờ và nó làm việc cho nhu cầu của tôi. Mã của tôi:

+ (NSImage *)pt_businessDefaultIcon 
{ 
    // Draws NSImageNameUser into a rendered bitmap. 
    // We do this because trying to create an NSData from 
    // [NSImage imageNamed:NSImageNameUser] directly results in a 32x32 image. 
    NSImage *icon = [NSImage imageNamed:NSImageNameUser]; 
    NSImage *renderedIcon = [[NSImage alloc] initWithSize:CGSizeMake(PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize)]; 
    [renderedIcon lockFocus]; 
    NSRect inRect = NSMakeRect(0, 0, PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize); 
    NSRect fromRect = NSMakeRect(0, 0, icon.size.width, icon.size.width);; 
    [icon drawInRect:inRect fromRect:fromRect operation:NSCompositeCopy fraction:1.0]; 
    [renderedIcon unlockFocus]; 

    return renderedIcon; 
} 

(? Cố gắng đăng bài này là câu trả lời của tôi, nhưng tôi không có đủ uy tín)

+0

Câu hỏi của bạn hữu ích đối với tôi và câu trả lời của bạn đã hoạt động. – Guillaume

Trả lời

4

Bạn dường như đang bỏ qua tài liệu. Cả hai câu hỏi chính của bạn đều được trả lời ở đó. Cocoa Drawing Guide (hướng dẫn đồng hành được liên kết từ tham chiếu API NSImage) có phần Hình ảnh bạn thực sự cần đọc kỹ và tham khảo bất kỳ lúc nào bạn có vấn đề về lưu trữ/lưu trữ/định cỡ/chất lượng.

... nếu tôi yêu cầu các TIFFRepresentation tôi nhận được một biểu tượng nhỏ khi NSImage thực tôi ban đầu được tạo ra dường như là vector và sẽ mở rộng quy mô lên để điền vào xem hình ảnh của tôi độc đáo.

Phần phụ có liên quan của phần Hình ảnh cho câu hỏi này là: Cách trình bày hình ảnh, Hình ảnh và Caching, và Kích thước và độ phân giải hình ảnh. Theo mặc định, các-bitMode cho một hình ảnh TIFF "Hoạt động như thể các thiết lập NSImageCacheBySize có hiệu lực." Ngoài ra, đối với các hoạt động định cỡ/kích thước trong bộ nhớ, -imageInterpolation rất quan trọng: "Bảng 6-4 liệt kê các thiết lập nội suy có sẵn". và "NSImageInterpolationHigh - Chậm hơn, nội suy chất lượng cao hơn".

Tôi khá chắc chắn điều này áp dụng cho hình ảnh hệ thống có tên cũng như bất kỳ hình ảnh nào khác.

Tôi đã hy vọng hình ảnh được tạo [bằng cách tải hình ảnh từ đĩa] sẽ có NSPDFImageRep mà tôi có thể sử dụng.

Phần phụ có liên quan: Hình ảnh đại diện. "... với hình ảnh dựa trên tệp, hầu hết các hình ảnh bạn tạo chỉ cần một biểu diễn hình ảnh duy nhất." và "Bạn có thể tạo nhiều biểu diễn trong các trường hợp sau, tuy nhiên: Để in, bạn có thể muốn tạo bản trình bày PDF hoặc bitmap có độ phân giải cao của hình ảnh của bạn".

Bạn nhận được biểu diễn phù hợp với hình ảnh được tải. Bạn phải tạo một biểu diễn PDF cho một hình ảnh TIFF, ví dụ. Để làm như vậy ở độ phân giải cao, bạn sẽ cần phải tham khảo lại chế độ lưu vào bộ nhớ đệm để bạn có thể nhận được các mục có độ phân giải cao hơn.

chi tiết đẹp quá nhiều để liệt kê vì số lượng hoán vị cao của cơ chế/hình ảnh/cài đặt/và bạn muốn làm gì với tất cả. Bài đăng của tôi có nghĩa là hướng dẫn chung về việc tìm kiếm thông tin cụ thể mà bạn cần cho tình huống của mình.

Để biết thêm chi tiết, hãy thêm chi tiết cụ thể: mã bạn đã cố gắng sử dụng, loại hình ảnh bạn đang tải hoặc tạo - bạn dường như đề cập đến hai khả năng khác nhau trong đoạn thứ tư của mình - và điều gì đã xảy ra.

+0

Cảm ơn thông tin và liên kết tài liệu. Tôi thực sự đã không đi qua đó khi nhìn vào lưu trữ NSImages. – zorn

0

tôi sẽ đoán rằng hình ảnh là "cứng có dây" vào hệ thống đồ họa bằng cách nào đó, và biểu diễn NSImage của nó chỉ đơn thuần là một con số chỉ ra đồ họa có dây cứng nào. Vì vậy, có khả năng những gì bạn cần làm là vẽ nó và sau đó chụp bản vẽ.

Rất thường, tạo ra một bộ điều khiển điểm cho rằng sẽ làm cho hình ảnh, tham khảo tài sản view của VC gây ra quan điểm để được trả lại, trích xuất các contentView của VC, có contentView.layer, làm cho layer vào một bối cảnh UIGraphics, nhận các UIImage từ ngữ cảnh, trích xuất bất kỳ đại diện bạn muốn từ UIImage.

(Có thể có một cách đơn giản hơn, nhưng đây là một trong tôi đã kết thúc sử dụng trong một trường hợp.)

(Và, tiếng thở dài, tôi cho rằng chương trình này không duy trì mở rộng quy mô một trong hai.)

+0

Thật không may là quy mô nhập học của bạn là chính xác ở đây. Đây không phải là một giải pháp phổ quát. Có, trên thực tế, không có giải pháp phổ quát cho các sự kiện được đưa ra. Nó phụ thuộc vào hình ảnh được tạo ra như thế nào (trong bộ nhớ hoặc nạp từ đĩa), cài đặt bộ nhớ đệm và nội suy của nó là gì và liệu các đại diện hiện tại có thể được thu nhỏ hay yêu cầu tạo và vẽ vào một đại diện mới với kích thước mong muốn/phẩm chất. –

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