57 lines
1.8 KiB
Java
57 lines
1.8 KiB
Java
package com.replaymod.extras.advancedscreenshots;
|
|
|
|
import com.replaymod.core.ReplayMod;
|
|
import com.replaymod.core.utils.Utils;
|
|
import com.replaymod.extras.ReplayModExtras;
|
|
import com.replaymod.render.frame.RGBFrame;
|
|
import com.replaymod.render.rendering.FrameConsumer;
|
|
import com.replaymod.replay.ReplayModReplay;
|
|
import net.minecraft.crash.CrashReport;
|
|
import org.lwjgl.util.ReadableDimension;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
|
|
public class ScreenshotWriter implements FrameConsumer<RGBFrame> {
|
|
|
|
private final File outputFile;
|
|
|
|
public ScreenshotWriter(File outputFile) {
|
|
this.outputFile = outputFile;
|
|
}
|
|
|
|
@Override
|
|
public void consume(RGBFrame frame) {
|
|
try {
|
|
final ReadableDimension frameSize = frame.getSize();
|
|
|
|
BufferedImage img = new BufferedImage(frameSize.getWidth(), frameSize.getHeight(), BufferedImage.TYPE_INT_RGB);
|
|
for (int y = 0; y < frameSize.getHeight(); y++) {
|
|
for (int x = 0; x < frameSize.getWidth(); x++) {
|
|
byte r = frame.getByteBuffer().get();
|
|
byte g = frame.getByteBuffer().get();
|
|
byte b = frame.getByteBuffer().get();
|
|
|
|
int color = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
|
|
img.setRGB(x, y, color);
|
|
}
|
|
}
|
|
|
|
ImageIO.write(img, "PNG", outputFile);
|
|
} catch (Throwable t) {
|
|
CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame");
|
|
|
|
ReplayMod.instance.runLater(() -> Utils.error(ReplayModExtras.LOGGER,
|
|
ReplayModReplay.instance.getReplayHandler().getOverlay(),
|
|
report, null));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void close() throws IOException {
|
|
|
|
}
|
|
}
|