2013-08-02 30 views
9

Tôi đã tạo NSImage 32 bit với mã sau.Cách tạo biểu diễn 8-, 4 và 1 bit của NSImage

NSBitmapImageRep *sourceRep = [[NSBitmapImageRep alloc] initWithData: imageData]; 

     // create a new bitmap representation scaled down 

      NSBitmapImageRep *newRep = 
       [[NSBitmapImageRep alloc] 
        initWithBitmapDataPlanes: NULL 
        pixelsWide: imageSize 
        pixelsHigh: imageSize 
        bitsPerSample: 8 
        samplesPerPixel: 4 
        hasAlpha: YES 
        isPlanar: NO 
        colorSpaceName: NSCalibratedRGBColorSpace 
        bytesPerRow: 0 
        bitsPerPixel: 0]; 

      // save the graphics context, create a bitmap context and set it as current 
      [NSGraphicsContext saveGraphicsState] ; 
      NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithBitmapImageRep: newRep]; 
      [NSGraphicsContext setCurrentContext: context] ; 

      // draw the bitmap image representation in it and restore the context 
      [sourceRep drawInRect: NSMakeRect(0.0f, 0.0f, imageSize, imageSize)] ; 
      [NSGraphicsContext restoreGraphicsState] ; 

      // set the size of the new bitmap representation 
      [newRep setSize: NSMakeSize(imageSize,imageSize)] ; 

      NSDictionary *imageProps2 = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithFloat:1.0], kCGImageDestinationLossyCompressionQuality, 
             nil]; 
      imageData = [newRep representationUsingType: NSPNGFileType properties: imageProps2]; 
    NSImage *bitImage = [[NSImage alloc]initWithData:imageData]; 

Bây giờ tôi cần phải tạo ra 8 bit (256 màu), 4 bit (16 màu), 1 bit (Black & trắng) NSBitmapImageRep đại diện. tôi muốn làm gì bây giờ?

+0

Bạn có coi bộ lọc Hình ảnh lõi không? – uchuugaka

+0

@ peterhosey, bất kỳ hạn chế nào về giấy phép hoặc thời gian xem xét thời gian chạy? như phải có sẵn như được xây dựng trong lib trong 10.6 vv? –

+2

@GradyPlayer: Tôi không có bất kỳ hạn chế nào như vậy, không. (Tôi chỉ là những câu hỏi bountying cho những ngày nghỉ, tôi không cần điều này cho công việc hoặc một cái gì đó.) –

Trả lời

2

Đáng buồn thay, tôi tin rằng bạn không thể sử dụng đồ họa cốt lõi. Ngữ cảnh đồ họa không hỗ trợ bất cứ điều gì với vài bit đó.

Tài liệu có bảng supported pixel formats.

Rõ ràng Carbon có (có?) Hỗ trợ cho nó, như đã thấy tham chiếu ở đây, nơi họ cũng than thở thiếu sự hỗ trợ Cocoa cho nó:

Hóa ra rằng về cơ bản Cocoa/Quartz không hỗ trợ downsampling hình ảnh để 8 -bit màu. Nó hỗ trợ vẽ chúng, và nó hỗ trợ upsampling, nhưng không đi theo cách khác. Tôi đoán đây là một thiết kế có chủ ý trên một phần của Apple để di chuyển ra khỏi hình ảnh được lập chỉ mục như là một kiểu dữ liệu đồ họa tiêu chuẩn - sau khi tất cả, màu 32-bit đơn giản hơn nhiều, phải không? Vâng, nó là, nhưng vẫn còn sử dụng hữu ích cho 8-bit. Vậy lam gi? Một khả năng được sử dụng Carbon, vì chung/QuickDraw Tướng/GWorld không hỗ trợ downsampling vv

Từ this thread

0

tốt này có lẽ sẽ là quá dài cho một nhận xét ...

Nó chắc chắn có vẻ như thế này chỉ là không thể ... tất cả các phần vẽ của ca cao thực sự dường như muốn sử dụng màu sắc 24-bit màu sắc ... Tôi đã có thể làm cho một 8bit NSBitmapImageRep nhưng nó là màu xám.

Vì vậy, tôi đoán chúng tôi phải tìm ra số lý do tại sao tại đây. Nếu bạn muốn có thể sử dụng NSImages được hỗ trợ bởi một số loại biểu diễn, tôi không nghĩ rằng đó là có thể.

nếu bạn muốn mẫu ngây thơ xuống (thay đổi giá trị 24/32-bit gần nhất thành bất kỳ pixel nào), điều đó rất có thể; điều này sẽ là để cho sự xuất hiện của hình ảnh 8-bit.

Nếu bạn muốn có thể ghi các tệp này ra với màu sắc phối màu/chỉ mục tốt thì tôi nghĩ tùy chọn tốt nhất là viết sang định dạng hình ảnh hỗ trợ những gì bạn muốn (như viết 256 GIF màu).

Nếu bạn muốn làm điều này downsampling mình đối với một số lý do, có 2 vấn đề ở bàn tay:

  1. Pallet hoặc lựa chọn CLUT.
  2. Phối màu.

Nếu bạn không muốn sử dụng màu đã được lập chỉ mục và chỉ muốn chia 8 bit thành 3-3-2 RGB thì dễ hơn một chút, nhưng kết quả kém hơn nhiều so với màu được lập chỉ mục.

4 bit là một mẹo nhỏ, bởi vì tôi thậm chí không biết sử dụng lịch sử tốt của màu 4 bit.

Tôi đã sử dụng màu được lập chỉ mục để hiển thị thời gian thoát khỏi tập hợp mandelbrot trong một dự án nhỏ mà tôi đã làm một lần ...

Tôi vừa xác minh rằng nó không hoạt động nữa (đã cũ cố định hiển thị đường ống OpenGL).

nhưng về cơ bản cho chế độ xem, bạn sẽ sử dụng glPixelMapuiv để ánh xạ màu chỉ mục thành giá trị byte, sau đó hiển thị bộ đệm byte bằng glDrawPixels;

Vì vậy ... tôi đoán nếu bạn bình luận và nói lý do tại sao bạn đang cố gắng làm những gì bạn đang làm, chúng tôi có thể giúp đỡ.

+0

Đoán ngẫu nhiên: Tạo biểu diễn biểu tượng cũ, chẳng hạn như ''icl8'','' icl4'' và ''ICN #'', từ biểu tượng 32 bit. –

3

Thật không may có vẻ như Cocoa không hỗ trợ hoạt động trên các hình ảnh được paletted.

Tôi đã là trying that before và kết luận của tôi là không thể cho PNG. NSGIFFileType là một ngoại lệ được mã hóa cứng và ngữ cảnh đồ họa là even more limited so với các biểu diễn bitmap (ví dụ: RGBA chỉ được hỗ trợ với alpha được xử lý trước).

Để làm việc xung quanh nó, tôi convert NSBitmapImageRep to raw RGBA bitmap, sử dụng libimagequant to remap it to a palette và sau đó libpng hoặc lodepng để ghi tệp PNG.