This page was machine-translated from Portuguese and may contain errors. The Portuguese version is canonical.
How to save an image as PNG or JPEG
Purpose. Persist an Image to disk. CrossFly offers two levels: convenience
(saves a file named by timestamp and returns the path) and full control (you provide the
OutputStream).
Convenience (saves the file automatically)
String toPng(String... prefix)— saves a PNG named<prefix><timestamp>.png. On desktop it writes toDevice.homeFolder; on mobile it writes to/sdcard/. Returns the saved path, ornullon error (the error is handled internally viaDebug.handle). Theprefixis optional.String toJpg(int... quality)— saves a JPEG named by timestamp.qualityis optional (default90);100= no compression,85= good compression,60= heavy compression but with noise. Returns the path, ornullon error.
Full control (you provide the stream)
void toPng(OutputStream s) throws ImageException, IOException— writes the PNG to the stream. The PNG is 24 BPP, or 32 BPP if the image has an alpha channel.void toJpg(OutputStream s, int quality) throws ImageException, IOException— writes the JPEG to the stream with the given quality (0–100). The stream is closed by the call.
Watch out for the overloads:
toPng(String...)/toJpg(int...)save a file and swallow exceptions (returnnull). WhereastoPng(OutputStream)/toJpg(OutputStream,int)propagateImageException/IOException. Choose according to whether or not you want to handle the error.
Complete example (copy, paste and run)
package com.exemplo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import dev.crossfly.ui.*; // Window
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.ui.image.*; // Image, ImageException
import dev.crossfly.util.*; // Debug
/** Runnable main screen. Point the launcher (classname) and run: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
try {
Image img = new Image("/sdcard/foto.jpg"); // your already-loaded or generated image
// 1) Convenience: file with timestamp; returns the path
String pngPath = img.toPng("thumb_"); // e.g.: .../thumb_20260706153000.png
String jpgPath = img.toJpg(85); // quality 85
Debug.log("PNG: " + pngPath + " | JPG: " + jpgPath);
// 2) Full control: you decide the destination and handle errors
try (OutputStream out = new FileOutputStream("/sdcard/saida.png")) {
img.toPng(out); // stream is closed by the call; propagates exceptions
} catch (ImageException | IOException e) {
// handle write/encoding failure
}
} catch (ImageException | IOException e) {
// failed to load the source image
}
}
}
The snippet below shows only the core. To run it, place it inside the
MainWindowskeleton above.
Minimal snippet
// verified in source: Image.java toPng/toJpg — lines 800, 811, 1454, 1479
import dev.crossfly.ui.image.*; // Image, ImageException
Image img = /* your already-loaded or generated image */;
// 1) Convenience: file with timestamp; returns the path
String pngPath = img.toPng("thumb_"); // e.g.: .../thumb_20260706153000.png
String jpgPath = img.toJpg(85); // quality 85
// 2) Full control: you decide the destination and handle errors
try (java.io.OutputStream out = new java.io.FileOutputStream("/sdcard/saida.png")) {
img.toPng(out); // stream is closed by the call; propagates exceptions
} catch (ImageException | java.io.IOException e) {
// handle write/encoding failure
}
Dive deeper
- Sibling recipe: thumbnail.md — generate the thumbnail and then save it with this recipe.
- Sibling recipe: screenshot.md — capture the screen and save it with
toPng().
Was this page helpful?Thanks for the feedback!