【问题标题】:Java ImageIO: How can I read a BufferedImage from file, so that it uses DataBufferFloat?Java ImageIO:如何从文件中读取 BufferedImage,以便它使用 DataBufferFloat?
【发布时间】:2011-01-17 21:13:59
【问题描述】:

我需要从文件中读取BufferedImage,它不使用DataBufferInt(通常),而是DataBufferFloat

请注意:我不仅需要一些独立的DataBufferFloat,还需要真正的BufferedImage 和底层DataBufferFloat

围绕这些东西的 API 非常复杂,我就是不知道该怎么做。

请帮忙。


编辑
找出不起作用的原因:

DataBufferDouble dbd = new DataBufferDouble(destWidth * destHeight * 4);

// Exception here:
// java.lang.IllegalArgumentException: Unsupported data type 5
WritableRaster wr = WritableRaster.createPackedRaster(
    dbd, destWidth, destHeight, 32, new Point(0, 0));

BufferedImage bi = new BufferedImage(ColorModel.getRGBdefault(),
    wr, false, (Hashtable<?, ?>) null);

【问题讨论】:

    标签: java graphics awt javax.imageio


    【解决方案1】:

    createPackedRaster 不适合这个。它创建了一个Raster 和一个SinglePixelPackedSampleModel,它将r/g/b/a 值存储在int 内的位字段中,因此它的transferType 只能是一个整数类型。

    您可能想要一个带有PixelInterleavedSampleModel 的通用栅格,例如

    DataBufferDouble dbd = new DataBufferDouble(destWidth * destHeight * 4);
    
    SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_DOUBLE, destWidth, destHeight, 4, destWidth * 4, new int[] {2, 1, 0, 3});
    
    WritableRaster wr = WritableRaster.createWritableRaster(sm, dbd, null);
    
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), true, true, ColorModel.TRANSLUCENT, DataBuffer.TYPE_FLOAT);
    
    BufferedImage bi = new BufferedImage(cm, wr, true, new Hashtable<Object, Object>());
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多