Private Sub WriteToStreamJPEG(In_image As Image, JPEG_quality As Int) As OutputStream
Private wrk_out As OutputStream
wrk_out.InitializeToBytesArray(0)
joMe.RunMethod("saveImageAsJPEG", Array(In_image, wrk_out, JPEG_quality))
Return wrk_out
End Sub
#If Java
//See http://www.java2s.com/Code/Java/2D-Graphics-GUI/WritesanimagetoanoutputstreamasaJPEGfileTheJPEGqualitycanbespecifiedinpercent.htm
//and https://stackoverflow.com/questions/19548363/image-saved-in-javafx-as-jpg-is-pink-toned
//and https://www.b4x.com/android/forum/threads/how-to-create-jpeg-output-stream.83830/#post-531118
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Locale;
import javafx.scene.image.Image;
import javafx.embed.swing.SwingFXUtils;
import java.awt.Graphics2D;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
/**
* Writes an image to an output stream as a JPEG file. The JPEG quality can
* be specified in percent.
*
* @param image
* image to be written
* @param stream
* target stream
* @param qualityPercent
* JPEG quality in percent
*
* @throws IOException
* if an I/O error occured
* @throws IllegalArgumentException
* if qualityPercent not between 0 and 100
*/
public static void saveImageAsJPEG(Image img,
OutputStream stream, int qualityPercent) throws IOException {
if ((qualityPercent < 0) || (qualityPercent > 100)) {
throw new IllegalArgumentException("Quality out of bounds!");
}
// Get buffered image
BufferedImage buffimg = SwingFXUtils.fromFXImage(img, null);
// Remove alpha-channel from buffered image
BufferedImage imageRGB = new BufferedImage(buffimg.getWidth(), buffimg.getHeight(), BufferedImage.OPAQUE);
Graphics2D graphics = imageRGB.createGraphics();
graphics.drawImage(buffimg, 0, 0, null);
graphics.dispose();
float quality = qualityPercent / 100f;
ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if (iter.hasNext()) {
writer = (ImageWriter) iter.next();
}
ImageOutputStream ios = ImageIO.createImageOutputStream(stream);
writer.setOutput(ios);
ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwparam.setCompressionQuality(quality);
writer.write(null, new IIOImage(imageRGB, null, null), iwparam);
ios.flush();
writer.dispose();
ios.close();
}
#End If