Hello guys,
we are working on RGB creation from Sentinel Images.
We are able to create the image but the ouput in jpg is different from the output from Java code.
To reproduce: CORRECT VERSION
Open Snap
Open One Sentinel 2 Image
Right Click -> Open RGB Image Window
Wait for the image to be shown
Right click on the Image View
Export View As Image
Select full scene
Select JPG format
The output file is correct.
Here our code snipped to create RGB by code and then save in PNG (correct) and JPG (opaque).
It looks like a transparency problem but did not find how to solve it.
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.esa.snap.core.dataio.ProductIO;
import org.esa.snap.core.datamodel.Band;
import org.esa.snap.core.datamodel.ImageInfo;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.core.image.ImageManager;
import org.esa.snap.core.util.ProductUtils;
import com.bc.ceres.core.ProgressMonitor;
public class Test_RGB_Only {
public static void main(String[] args) throws Exception {
// Input file
String sFilePath = "S2A_MSIL1C_20180102T102421_N0206_R065_T32TMQ_20180102T123237.zip";
// Band Images
String sRedBandName = "B4";
String sGreenBandName = "B3";
String sBlueBandName = "B2";
// Output files
String sOutPath = "RGB.png";
// Use null output dimension to create a full resolution img
createRGB(null, sFilePath, sRedBandName, sGreenBandName, sBlueBandName, sOutPath);
System.out.println("TEST DONE");
}
private static void createRGB(Dimension oOutputDimension , String sFilePath, String sRedBandName, String sGreenBandName, String sBlueBandName, String sOutPath) throws IOException, InterruptedException {
File file = new File(sFilePath);
Product product = ProductIO.readProduct(file);
Band oRedBand = product.getBand(sRedBandName);
Band oGreenBand = product.getBand(sGreenBandName);
Band oBlueBand = product.getBand(sBlueBandName);
RenderedImage oOutImg;
System.out.println("createRGB: start buildRGBImage");
oOutImg = buildRGBImage(oRedBand , oGreenBand, oBlueBand, oOutputDimension);
long lStartTime = System.currentTimeMillis();
ImageIO.write(oOutImg, "PNG", new File(sOutPath));
System.out.println("createRGB: PNG FILE Saved in " + (System.currentTimeMillis() - lStartTime) + " ms");
lStartTime = System.currentTimeMillis();
ImageIO.write(oOutImg, "JPG", new File(sOutPath.replace(".png", ".jpg")));
System.out.println("createRGB: JPG FILE Saved in " + (System.currentTimeMillis() - lStartTime) + " ms");
}
/**
* Return a scaled RGB rendered image from the specified Bands. If oOutputImageSize returns default dimension
* @param oRedBand Red Band
* @param oGreenBand Green Band
* @param oBlueBand Blue Band
* @param oOutputImageSize Ouput Size
* @return Rendered Image
* @throws IOException
*/
public static BufferedImage buildRGBImage(RasterDataNode oRedBand, RasterDataNode oGreenBand, RasterDataNode oBlueBand, Dimension oOutputImageSize) throws IOException {
RenderedImage oOutputImage = null;
if (oRedBand==null || oBlueBand == null || oGreenBand == null) {
System.out.println("buildRGBImage: band null");
return null;
}
if (oRedBand.getProduct()==null || oBlueBand.getProduct() == null || oGreenBand.getProduct() == null) {
System.out.println("buildRGBImage: band product null");
return null;
}
long lStartTime = System.currentTimeMillis();
RasterDataNode aoRasters [] = { oRedBand, oGreenBand, oBlueBand };
ImageInfo oInfo = ProductUtils.createImageInfo(aoRasters, true, ProgressMonitor.NULL);
oOutputImage = ImageManager.getInstance().createColoredBandImage(aoRasters, oInfo, 0);
System.out.println("BandImageManager.buildImage: render done: " + (System.currentTimeMillis() - lStartTime) + " ms");
lStartTime = System.currentTimeMillis();
if (oOutputImageSize == null) {
oOutputImageSize = new Dimension(oOutputImage.getWidth(), oOutputImage.getHeight());
}
BufferedImage oResizedImage = new BufferedImage((int) oOutputImageSize.getWidth(), (int) oOutputImageSize.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D oGraphics = oResizedImage.createGraphics();
double dX = (oOutputImageSize.getWidth() / (double)oOutputImage.getWidth());
double dY = (oOutputImageSize.getHeight() / (double)oOutputImage.getHeight());
oGraphics.drawRenderedImage(oOutputImage, AffineTransform.getScaleInstance(dX, dY));
oGraphics.dispose();
System.out.println("BandImageManager.buildImage: scaling done: " + (System.currentTimeMillis() - lStartTime) + " ms");
return oResizedImage;
}
}