package org.geotools.arcsde.gce.producer; import java.awt.image.BufferedImage; import java.awt.image.DataBufferFloat; import com.esri.sde.sdk.client.SeRasterAttr; import com.esri.sde.sdk.client.SeRasterConsumer; import com.esri.sde.sdk.client.SeRasterRenderedImage; import com.esri.sde.sdk.client.SeRasterScanLineGenerator; public class ArcSDERasterFloatProducerImpl extends ArcSDERasterProducer { public ArcSDERasterFloatProducerImpl() { super(null, null, SeRasterScanLineGenerator.MASK_ALL_ON); } public ArcSDERasterFloatProducerImpl(SeRasterAttr attr, BufferedImage sourceImage, int maskType) { super(attr, sourceImage, maskType); } @Override public void setSourceImage(BufferedImage sourceImage) { // TODO: check that the image is compatible this.sourceImage = sourceImage; } public void startProduction(final SeRasterConsumer consumer) { Thread runme; if (consumer instanceof SeRasterRenderedImage) { runme = new Thread() { @Override public void run() { try { final int imageHeight = sourceImage.getHeight(); float min = 0, max = 0; // for each band... for (int i = 0; i < sourceImage.getData().getNumBands(); i++) { // get the data as floats, then convert to four-byte segments byte[] sdeRasterData = new byte[sourceImage.getWidth() * 4 * sourceImage.getHeight()]; float[] srcImgData = ((DataBufferFloat) sourceImage.getData() .getDataBuffer()).getData(); for (int y = 0; y < sourceImage.getHeight(); y++) { // byte[] curRow = new byte[sourceImage.getWidth() * 4]; for (int x = 0; x < sourceImage.getWidth(); x++) { // final float sample = sourceImage.getData().getSampleFloat(x, // y, i); final float sample = srcImgData[y * sourceImage.getWidth() + x]; min = Math.min(min, sample); max = Math.max(max, sample); // convert float to bytes int bits = Float.floatToIntBits(sample); sdeRasterData[y * sourceImage.getWidth() * 4 + x * 4] = (byte) ((bits & 0xff000000) >> 24); sdeRasterData[y * sourceImage.getWidth() * 4 + x * 4 + 1] = (byte) ((bits & 0x00ff0000) >> 16); sdeRasterData[y * sourceImage.getWidth() * 4 + x * 4 + 2] = (byte) ((bits & 0x0000ff00) >> 8); sdeRasterData[y * sourceImage.getWidth() * 4 + x * 4 + 3] = (byte) (bits & 0x000000ff); } } consumer.setScanLines(imageHeight, sdeRasterData, null); consumer.rasterComplete(SeRasterConsumer.SINGLEFRAMEDONE); } System.out.println("min value: " + min + ", max value: " + max); consumer.rasterComplete(SeRasterConsumer.STATICIMAGEDONE); } catch (Exception se) { se.printStackTrace(); consumer.rasterComplete(SeRasterConsumer.IMAGEERROR); } } }; } else { throw new IllegalArgumentException("You must set SeRasterAttr.setImportMode(false) to " + "load data using this SeProducer implementation."); } runme.start(); } }