2012-06-16 53 views
8

Tôi đã nhìn vào lớp ImageConverter, cố gắng tìm ra cách để chuyển đổi một BufferedImage thành màu 8-bit, nhưng tôi không có ý tưởng làm thế nào tôi sẽ làm điều này. Tôi cũng đang tìm kiếm trên internet và tôi không thể tìm thấy câu trả lời đơn giản, tất cả họ đều nói về hình ảnh màu xám 8 bit. Tôi chỉ đơn giản muốn chuyển đổi màu sắc của một hình ảnh thành 8 bit ... không có gì khác, không thay đổi kích thước không có gì. Có ai tâm trí cho tôi biết làm thế nào để làm điều này.Làm thế nào để chuyển đổi BufferedImage thành 8 bit?

+0

Bạn có thể phải chọn một thuật toán lượng tử, tức là. một cái gì đó mà chuyển đổi phạm vi màu sắc của hình ảnh của bạn thành một bảng mục nhập 256. – PhiLho

+0

Ý của bạn là gì khi chuyển đổi màu của hình ảnh thành 8-bit? Tôi đoán bạn muốn giảm không gian màu? Bạn có muốn thực hiện lượng tử hóa màu? – Behe

+0

Các bạn có thể chỉ cho tôi một thư viện/API thuộc loại nào đó không? Tôi không biết bạn đang nói về cái gì. Điều đó cũng có vẻ như tôi sẽ có thể tạo bảng màu của riêng tôi mà sẽ là sự kiện tốt hơn nếu có thể. –

Trả lời

2

này đoạn mã từ bài viết "Transparent gifs in Java" at G-Man's Uber Software Engineering Blog hoạt động tốt:

public static void main(String[] args) throws Exception { 
    BufferedImage src = convertRGBAToIndexed(ImageIO.read(new File("/src.jpg"))); 
    ImageIO.write(src, "gif", new File("/dest.gif")); 
} 

public static BufferedImage convertRGBAToIndexed(BufferedImage src) { 
    BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); 
    Graphics g = dest.getGraphics(); 
    g.setColor(new Color(231, 20, 189)); 

    // fill with a hideous color and make it transparent 
    g.fillRect(0, 0, dest.getWidth(), dest.getHeight()); 
    dest = makeTransparent(dest, 0, 0); 

    dest.createGraphics().drawImage(src, 0, 0, null); 
    return dest; 
} 

public static BufferedImage makeTransparent(BufferedImage image, int x, int y) { 
    ColorModel cm = image.getColorModel(); 
    if (!(cm instanceof IndexColorModel)) 
     return image; // sorry... 
    IndexColorModel icm = (IndexColorModel) cm; 
    WritableRaster raster = image.getRaster(); 
    int pixel = raster.getSample(x, y, 0); // pixel is offset in ICM's palette 
    int size = icm.getMapSize(); 
    byte[] reds = new byte[size]; 
    byte[] greens = new byte[size]; 
    byte[] blues = new byte[size]; 
    icm.getReds(reds); 
    icm.getGreens(greens); 
    icm.getBlues(blues); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); 
    return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); 
} 
+0

Làm việc tuyệt vời, chỉ cần loại bỏ phần trong suốt. –

1

Bạn có thể sử dụng phương thức convert8 trong lớp ConvertUtil.

Để biết chi tiết, hãy xem here.

+0

Tôi không thể sử dụng ConvertUtil.convert8, vì vậy tôi sẽ phải nhập lớp đó, nhưng tôi không thể tìm thấy mã nhập là gì. Bạn có cơ hội làm những gì/nó ở đâu? – Dak31

4

Bạn có thể sử dụng JAI (Java Advanced Imaging), thư viện ảnh chính thức của Sun (nay là Oracle) để thực hiện điều đó.

ColorQuantizerDescriptor cho biết lựa chọn quy trình lượng tử hóa mà bạn có thể áp dụng.

+0

Bạn có một số mã mẫu? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –

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