2015-11-25 12 views
5

Tôi đang tìm cách nhanh nhất để ghi pixel trên javafx.scene.image.Image. Việc ghi vào mảng sao lưu của BufferedImage nhanh hơn nhiều. Ít nhất là trên hình ảnh thử nghiệm tôi đã thực hiện nó chỉ ~ 20ms cho BufferedImage, WritableImage mặt khác mất ~ 100ms. Tôi đã thử SwingFXUtils nhưng không may mắn.JavaFX: Cách nhanh nhất để ghi pixel vào PixelWriter

Mã cho BufferedImage (nhanh hơn):

BufferedImage bi = createCompatibleImage(width, height); 
WritableRaster raster = bi.getRaster(); 
DataBufferInt dataBuffer = (DataBufferInt) raster.getDataBuffer(); 

System.arraycopy(pixels, 0, dataBuffer.getData(), 0, pixels.length); 

Mã cho WritableImage (chậm hơn):

WritableImage wi = new WritableImage(width, height); 
PixelWriter pw = wi.getPixelWriter(); 
WritablePixelFormat<IntBuffer> pf = WritablePixelFormat.getIntArgbInstance(); 

pw.setPixels(0, 0, width, height, pf, pixels, 0, width); 

Có thể có một cách để viết thư cho WritableImage 's mảng ủng hộ quá?

Trả lời

1

Đối với hiệu suất của trình ghi pixel, điều cực kỳ quan trọng là bạn chọn định dạng pixel phù hợp. Bạn có thể kiểm tra định dạng pixel gốc là gì thông qua

pw.getPixelFormat().getType() 

Trên máy Mac của tôi đây là PixelFormat.Type.BYTE_BGRA_PRE. Nếu dữ liệu thô của bạn phù hợp với định dạng pixel này thì việc chuyển sang hình ảnh sẽ khá nhanh. Nếu không, dữ liệu pixel phải được chuyển đổi và mất một thời gian.

+0

Điều này không trả lời được câu hỏi. Định dạng Pixel phụ thuộc vào hình ảnh nguồn đang được sử dụng. Nếu bạn không sử dụng định dạng phù hợp với định dạng hình ảnh nguồn, bạn sẽ nhận được một ngoại lệ khi chạy. – jjhavokk

+1

Tôi giả định rằng định dạng pixel nguồn có thể được điều chỉnh sao cho tốc độ truyền tối đa có thể đạt được. Điều này thường xảy ra khi bạn tự tạo nội dung pixel. – mipa

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