Я пытаюсь создать фоновый эффект как это для моего меню паузы. Моя нынешняя идея - сделать снимок экрана на паузе, сохранить его, открыть, гауссов размыть, затем отобразить на экране и отобразить меню на столе. Единственная проблема заключается в том, что я не знаю, как эффективно сохранять снимок экрана.
Я попытался использовать batch.setColor(0,0,0,0.7f);
, чтобы отобразить на заднем фоне выцветшее изображение, но это не дало мне эффекта размытия, который я искал, а просто оттенка, как я предполагал.
Приятно оценить примеры/документацию.
EDIT: нашел этот код
package com.me.mygdxgame;
import java.awt.Point;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.PixelInterleavedSampleModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.ScreenUtils;
public class ScreenShot {
private static final int[] RGBA_OFFSETS = { 0, 1, 2, 3 };
private static final int[] RGB_OFFSETS = { 0, 1, 2 };
public static void saveScreenshot(String baseName) throws IOException {
File createTempFile = File.createTempFile(baseName, ".png");
saveScreenshot(createTempFile);
}
public static void saveScreenshot(File file) throws IOException {
saveScreenshot(file, false);
}
public static void saveScreenshot(File file, boolean hasAlpha) throws IOException {
if (Gdx.app.getType() == ApplicationType.Android)
return;
byte[] screenshotPixels = ScreenUtils.getFrameBufferPixels(true);
int width = Gdx.graphics.getWidth();
int height = Gdx.graphics.getHeight();
saveScreenshot(file, screenshotPixels, width, height, hasAlpha);
}
public static void saveScreenshot(File file, byte[] pixels, int width, int height, boolean hasAlpha) throws IOException {
DataBufferByte dataBuffer = new DataBufferByte(pixels, pixels.length);
PixelInterleavedSampleModel sampleModel = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, width, height, 4, 4 * width, getOffsets(hasAlpha));
WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, new Point(0, 0));
BufferedImage img = new BufferedImage(getColorModel(hasAlpha), raster, false, null);
ImageIO.write(img, "png", file);
}
private static ColorModel getColorModel(boolean alpha) {
if (alpha)
return new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8, 8 }, true, false, ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
return new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8 }, false, false, ComponentColorModel.OPAQUE, DataBuffer.TYPE_BYTE);
}
private static int[] getOffsets(boolean alpha) {
if (alpha)
return RGBA_OFFSETS;
return RGB_OFFSETS;
}
}
но он дает мне эту ошибку, когда я пытаюсь выполнить saveScreenshot("output");
(runnign desktop version, если это имеет значение. Не тестировалось на андроиде)
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.awt.image.RasterFormatException: Incorrect scanline stride: 3200
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:111)
Caused by: java.awt.image.RasterFormatException: Incorrect scanline stride: 3200
строка ошибки: ImageIO.write(img, "png", file);