use of javax.imageio.ImageWriter in project ChatGameFontificator by GlitchCog.
the class ControlWindow method saveScreenshot.
/**
* Takes and saves a screenshot of the current chat window
*
* @return whether the screenshot was saved
*/
private boolean saveScreenshot() {
// Take the screenshot before the save file chooser is shown
ChatPanel chat = chatWindow.getChatPanel();
BufferedImage chatImage = new BufferedImage(chat.getWidth(), chat.getHeight(), screenshotOptions.isTransparencyEnabled() ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
Graphics chatGraphics = chatImage.getGraphics();
chat.paint(chatGraphics);
final boolean chromaEnabled = Boolean.toString(true).equalsIgnoreCase(fProps.getProperty(FontificatorProperties.KEY_CHAT_CHROMA_ENABLED));
if (screenshotOptions.isTransparencyEnabled() && chromaEnabled) {
final int chromaKey = new Color(Integer.parseInt(fProps.getProperty(FontificatorProperties.KEY_COLOR_CHROMA_KEY), 16)).getRGB();
final int transparentPixel = new Color(0, true).getRGB();
for (int r = 0; r < chatImage.getHeight(); r++) {
for (int c = 0; c < chatImage.getWidth(); c++) {
if (chatImage.getRGB(c, r) == chromaKey) {
chatImage.setRGB(c, r, transparentPixel);
}
}
}
}
File saveFile = getTargetSaveFile(screenshotSaver, DEFAULT_SCREENSHOT_FILE_EXTENSION);
if (saveFile != null) {
try {
if (screenshotOptions.isMetadataEnabled()) {
ImageWriter writer = ImageIO.getImageWritersByFormatName("PNG").next();
ImageOutputStream stream = ImageIO.createImageOutputStream(saveFile);
writer.setOutput(stream);
IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(chatImage), writer.getDefaultWriteParam());
IIOMetadataNode title = generateMetadataNode("Title", "CGF Screenshot");
IIOMetadataNode software = generateMetadataNode("Software", "Chat Game Fontificator");
final String fontGameName = ControlPanelFont.getFontGameName(fProps.getProperty(FontificatorProperties.KEY_FONT_FILE_FONT));
final String borderGameName = ControlPanelFont.getBorderGameName(fProps.getProperty(FontificatorProperties.KEY_FONT_FILE_BORDER));
IIOMetadataNode description = generateMetadataNode("Description", fontGameName + " Font / " + borderGameName + " Border");
IIOMetadataNode text = new IIOMetadataNode("tEXt");
text.appendChild(title);
text.appendChild(software);
text.appendChild(description);
final String metadataFormatStr = "javax_imageio_png_1.0";
IIOMetadataNode root = new IIOMetadataNode(metadataFormatStr);
root.appendChild(text);
metadata.mergeTree(metadataFormatStr, root);
writer.write(metadata, new IIOImage(chatImage, null, metadata), writer.getDefaultWriteParam());
stream.close();
} else {
ImageIO.write(chatImage, "png", saveFile);
}
return true;
} catch (Exception e) {
logger.error("Unable to save screenshot", e);
return false;
}
}
return false;
}
use of javax.imageio.ImageWriter in project ChatGameFontificator by GlitchCog.
the class AnimatedGifUtil method loadDittoAnimatedGif.
/**
* Fix (ditto) for Java's animated GIF interpretation
*
* Adapted from http://stackoverflow.com/questions/26801433/fix-frame-rate-of-animated-gif-in-java#answer-26829534
*
* @param url
* The URL for the animated GIF to be loaded
* @param dim
* The dimension object to be filled by the width and height of the loaded animated GIF
* @return The loaded animated GIF
* @throws Exception
*/
public static Image loadDittoAnimatedGif(final URL url, Dimension dim) {
final Image dimImage = new ImageIcon(url).getImage();
Image image = null;
try {
ImageReader gifReader = ImageIO.getImageReadersByFormatName(GIF_EXTENSION).next();
InputStream imageStream = url.openStream();
gifReader.setInput(ImageIO.createImageInputStream(imageStream));
IIOMetadata imageMetaData = gifReader.getImageMetadata(0);
String metaFormatName = imageMetaData.getNativeMetadataFormatName();
final int frameCount = gifReader.getNumImages(true);
ByteArrayOutputStream baoStream = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(baoStream);
ImageWriter writer = ImageIO.getImageWriter(gifReader);
writer.setOutput(ios);
writer.prepareWriteSequence(null);
final int imgWidth = dimImage.getWidth(null);
final int imgHeight = dimImage.getHeight(null);
dim.setSize(imgWidth, imgHeight);
for (int i = 0; i < frameCount; i++) {
// This read method takes into account the frame's top and left coordinates
BufferedImage frame = gifReader.read(i);
IIOMetadataNode nodes = (IIOMetadataNode) gifReader.getImageMetadata(i).getAsTree(metaFormatName);
for (int j = 0; j < nodes.getLength(); j++) {
IIOMetadataNode node = (IIOMetadataNode) nodes.item(j);
if (GRAPHIC_CTRL_EXT.equalsIgnoreCase(node.getNodeName())) {
int delay = Integer.parseInt(node.getAttribute(ATTRIBUTE_DELAY_TIME));
// Minimum delay for browsers, which delay animated GIFs much more than would be to spec
if (delay < MIN_ANI_GIF_DELAY) {
node.setAttribute(ATTRIBUTE_DELAY_TIME, Integer.toString(MIN_ANI_GIF_DELAY));
}
// at least not for BTTV's (ditto)
if (node.getAttribute(ATTRIBUTE_DISPOSAL_METHOD).equals(DISPOSE_RESTORE_TO_PREVIOUS)) {
node.setAttribute(ATTRIBUTE_DISPOSAL_METHOD, DISPOSE_RESTORE_TO_BGCOLOR);
}
}
}
IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(frame), null);
metadata.setFromTree(metadata.getNativeMetadataFormatName(), nodes);
// This modified frame is necessary to get the correct image placement, width, and height in the final GIF
BufferedImage frameMod = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_ARGB);
Graphics big = frameMod.getGraphics();
big.drawImage(frame, 0, 0, null);
IIOImage fixedFrame = new IIOImage(frameMod, null, metadata);
writer.writeToSequence(fixedFrame, writer.getDefaultWriteParam());
}
writer.endWriteSequence();
if (ios != null) {
ios.close();
}
image = Toolkit.getDefaultToolkit().createImage(baoStream.toByteArray());
} catch (Exception e) {
// If anything goes wrong, just load it normally
logger.error("Error loading animated GIF (ditto) from " + url, e);
image = new ImageIcon(url).getImage();
dim.setSize(image.getWidth(null), image.getHeight(null));
}
return image;
}
use of javax.imageio.ImageWriter in project zm-mailbox by Zimbra.
the class NativeFormatter method getResizedImageData.
/**
* If the image stored in the {@code MimePart} exceeds the given width,
* shrinks the image and returns the shrunk data. If the
* image width is smaller than {@code maxWidth} or resizing is not supported,
* returns {@code null}.
*/
private static byte[] getResizedImageData(MimePart mp, Integer maxWidth, Integer maxHeight) throws IOException, MessagingException {
ImageReader reader = null;
ImageWriter writer = null;
InputStream in = null;
if (maxWidth == null)
maxWidth = LC.max_image_size_to_resize.intValue();
if (maxHeight == null)
maxHeight = LC.max_image_size_to_resize.intValue();
try {
// Get ImageReader for stream content.
reader = ImageUtil.getImageReader(Mime.getContentType(mp), mp.getFileName());
if (reader == null) {
log.debug("No ImageReader available.");
return null;
}
// Read message content.
in = mp.getInputStream();
reader.setInput(new MemoryCacheImageInputStream(in));
BufferedImage img = reader.read(0);
int width = img.getWidth(), height = img.getHeight();
if (width <= maxWidth && height <= maxHeight) {
log.debug("Image %dx%d is less than max %dx%d. Not resizing.", width, height, maxWidth, maxHeight);
return null;
}
// Resize.
writer = ImageIO.getImageWriter(reader);
if (writer == null) {
log.debug("No ImageWriter available.");
return null;
}
double ratio = Math.min((double) maxWidth / width, (double) maxHeight / height);
width *= ratio;
height *= ratio;
BufferedImage small = ImageUtil.resize(img, width, height);
ByteArrayOutputStream out = new ByteArrayOutputStream();
writer.setOutput(new MemoryCacheImageOutputStream(out));
writer.write(small);
return out.toByteArray();
} finally {
ByteUtil.closeStream(in);
if (reader != null) {
reader.dispose();
}
if (writer != null) {
writer.dispose();
}
}
}
use of javax.imageio.ImageWriter in project jdk8u_jdk by JetBrains.
the class BMPImageWriter method writeEmbedded.
private void writeEmbedded(IIOImage image, ImageWriteParam bmpParam) throws IOException {
String format = compressionType == BI_JPEG ? "jpeg" : "png";
Iterator iterator = ImageIO.getImageWritersByFormatName(format);
ImageWriter writer = null;
if (iterator.hasNext())
writer = (ImageWriter) iterator.next();
if (writer != null) {
if (embedded_stream == null) {
throw new RuntimeException("No stream for writing embedded image!");
}
writer.addIIOWriteProgressListener(new IIOWriteProgressAdapter() {
public void imageProgress(ImageWriter source, float percentageDone) {
processImageProgress(percentageDone);
}
});
writer.addIIOWriteWarningListener(new IIOWriteWarningListener() {
public void warningOccurred(ImageWriter source, int imageIndex, String warning) {
processWarningOccurred(imageIndex, warning);
}
});
writer.setOutput(ImageIO.createImageOutputStream(embedded_stream));
ImageWriteParam param = writer.getDefaultWriteParam();
//param.setDestinationBands(bmpParam.getDestinationBands());
param.setDestinationOffset(bmpParam.getDestinationOffset());
param.setSourceBands(bmpParam.getSourceBands());
param.setSourceRegion(bmpParam.getSourceRegion());
param.setSourceSubsampling(bmpParam.getSourceXSubsampling(), bmpParam.getSourceYSubsampling(), bmpParam.getSubsamplingXOffset(), bmpParam.getSubsamplingYOffset());
writer.write(null, image, param);
} else
throw new RuntimeException(I18N.getString("BMPImageWrite5") + " " + format);
}
use of javax.imageio.ImageWriter in project Lucee by lucee.
the class Image method _writeOut.
private void _writeOut(ImageOutputStream ios, String format, float quality, boolean noMeta) throws IOException, ExpressionException {
if (quality < 0 || quality > 1)
throw new IOException("quality has an invalid value [" + quality + "], value has to be between 0 and 1");
if (StringUtil.isEmpty(format))
format = this.format;
if (StringUtil.isEmpty(format))
throw new IOException("missing format");
BufferedImage im = image();
// IIOMetadata meta = noMeta?null:metadata(format);
IIOMetadata meta = noMeta ? null : getMetaData(null);
ImageWriter writer = null;
ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(im);
Iterator<ImageWriter> iter = ImageIO.getImageWriters(type, format);
if (iter.hasNext()) {
writer = iter.next();
}
if (writer == null)
throw new IOException("no writer for format [" + format + "] available, available writer formats are [" + ListUtil.arrayToList(ImageUtil.getWriterFormatNames(), ",") + "]");
ImageWriteParam iwp = getImageWriteParam(im, writer, quality, this.format, format);
writer.setOutput(ios);
try {
writer.write(meta, new IIOImage(im, null, meta), iwp);
} finally {
writer.dispose();
ios.flush();
this.format = format;
}
}
Aggregations