2009-07-17 46 views
5

Cách đúng để chuyển đổi mảng thô của byte thành Hình ảnh trong Java SE là gì. mảng bao gồm các byte, trong đó mỗi byte ba đại diện cho một pixel, với mỗi byte cho thành phần RGB tương ứng.Cách chuyển đổi mảng byte thành hình ảnh trong Java SE

Ai có thể đề xuất mẫu mã không?

Cảm ơn, Mike

+0

Cuối cùng tôi không tìm thấy bất cứ điều gì tốt hơn sau đó: \t \t \t for (int y = 0; y Ma99uS

+0

kích thước của mảng byte là gì? Có phải mảng 1 chiều, mảng 2 chiều hay mảng 3 chiều không? –

Trả lời

6

Giả sử bạn biết chiều cao và chiều rộng của hình ảnh.

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
for(int r=0; r<height; r++) 
for(int c=0; c<width; c++) 
{ 
    int index=r*width+c; 
    int red=colors[index] & 0xFF; 
    int green=colors[index+1] & 0xFF; 
    int blue=colors[index+2] & 0xFF; 
    int rgb = (red << 16) | (green << 8) | blue; 
    img.setRGB(c, r, rgb); 
} 

Gần đúng. Điều này giả định rằng dữ liệu pixel được mã hóa dưới dạng một tập hợp các hàng; và chiều dài của màu là 3 * chiều rộng * chiều cao (có thể hợp lệ).

+0

để lặp qua mảng là lựa chọn tốt nhất của tôi ở đây? Nó cảm thấy rằng có được một số phương pháp mà chấp nhận mảng như một tham số và populates/tái tạo hình ảnh trong một đi. Có lẽ một cái gì đó để làm với lớp Raster? – Ma99uS

+0

Không phải với kiến ​​thức của tôi, mặc dù Raster không quen thuộc với tôi. Nếu điều này theo định dạng hình ảnh chuẩn, bạn có thể sử dụng lớp ImageIO, nhưng đó là giới hạn kiến ​​thức của tôi. – CoderTao

+1

Bạn cũng có thể làm: 'int rgb = ((int) màu sắc [in] << 24) + ((int) màu sắc [trong + 1] << 8) + (int) màu sắc [trong]' – notnoop

1

Có một biến thể setRGB mà chấp nhận một mảng int các giá trị RGBA:

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
int[] raw = new int[data.length * 4/3]; 
for (int i = 0; i < data.length/3; i++) { 
    raw[i] = 0xFF000000 | 
     ((data[3 * i + 0] & 0xFF) << 16) | 
     ((data[3 * i + 1] & 0xFF) << 8) | 
     ((data[3 * i + 2] & 0xFF)); 
} 
img.setRGB(0, 0, width, height, raw, 0, width); 

Các đặc tính hiệu suất tương tự như giải pháp CoderTao 's.

8

Bạn có thể làm điều đó bằng cách sử dụng lớp Raster. Nó tốt hơn vì nó không yêu cầu lặp và sao chép các mảng byte. Cách tiếp cận

byte[] raw = new byte[width*height*3]; // raw bytes of our image 
DataBuffer buffer = new DataBufferByte(raw, raw.length); 

//The most difficult part of awt api for me to learn 
SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, width, height, 3, width*3, new int[]{2,1,0}); 

Raster raster = Raster.createRaster(sampleModel, buffer, null); 

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 
image.setData(raster); 
+0

Cảm ơn bạn đã đăng bài đó. Nó thực sự tiện dụng! –

2

folkyatina của hoạt động nếu giá trị RGB của bạn là trong B, G, R trật tự, nhưng nếu họ đang ở R, G, trật tự B Tôi đã tìm thấy đoạn mã sau để làm việc:

DataBuffer rgbData = new DataBufferByte(rgbs, rgbs.length); 

    WritableRaster raster = Raster.createInterleavedRaster(
     rgbData, width, height, 
     width * 3, // scanlineStride 
     3, // pixelStride 
     new int[]{0, 1, 2}, // bandOffsets 
     null); 

    ColorModel colorModel = new ComponentColorModel(
     ColorSpace.getInstance(ColorSpace.CS_sRGB), 
     new int[]{8, 8, 8}, // bits 
     false, // hasAlpha 
     false, // isPreMultiplied 
     ComponentColorModel.OPAQUE, 
     DataBuffer.TYPE_BYTE); 

    return new BufferedImage(colorModel, raster, false, null); 
Các vấn đề liên quan