Как сделать скриншот с глубиной цвета 8 бит?
Вот пример для получения 24 и 16 битного скриншота, помогите пожалуйста доработать этот код для создания 8 битного скриншота.
package javaapplication28;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import com.sun.jna.Memory;
import com.sun.jna.platform.win32.GDI32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HBITMAP;
import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinGDI;
import com.sun.jna.platform.win32.WinGDI.BITMAPINFO;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.awt.image.DataBufferUShort;
public class SupportGDI {
// 24bit
public static final DirectColorModel SCREENSHOT_COLOR_MODEL_24 = new DirectColorModel(24, 0x00FF0000, 0xFF00, 0xFF);
// 16bit
public static final DirectColorModel SCREENSHOT_COLOR_MODEL_16 = new DirectColorModel(16, 0x7C00, 0x3E0, 0x1F);
// 8bit
public static final DirectColorModel SCREENSHOT_COLOR_MODEL_8 = new DirectColorModel(8, 3, 3, 2);
public static final int[] SCREENSHOT_BAND_MASKS_24 = {
SCREENSHOT_COLOR_MODEL_24.getRedMask(),
SCREENSHOT_COLOR_MODEL_24.getGreenMask(),
SCREENSHOT_COLOR_MODEL_24.getBlueMask()
};
public static final int[] SCREENSHOT_BAND_MASKS_16 = {
SCREENSHOT_COLOR_MODEL_16.getRedMask(),
SCREENSHOT_COLOR_MODEL_16.getGreenMask(),
SCREENSHOT_COLOR_MODEL_16.getBlueMask()
};
public static final int[] SCREENSHOT_BAND_MASKS_8 = {
SCREENSHOT_COLOR_MODEL_8.getRedMask(),
SCREENSHOT_COLOR_MODEL_8.getGreenMask(),
SCREENSHOT_COLOR_MODEL_8.getBlueMask()
};
public static BufferedImage getScreenshot(HWND target, int width, int height) throws Exception {
int bit = 8;
HDC hdcTarget = User32.INSTANCE.GetDC(target);
HDC hdcTargetMem = GDI32.INSTANCE.CreateCompatibleDC(hdcTarget);
HBITMAP hBitmap = GDI32.INSTANCE.CreateCompatibleBitmap(hdcTarget, width, height);
GDI32.INSTANCE.SelectObject(hdcTargetMem, hBitmap);
GDI32.INSTANCE.BitBlt(hdcTargetMem, 0, 0, width, height, hdcTarget, 0, 0, GDI32.SRCCOPY);
//
int bufferSize = width * height;
int pixelByte;
DirectColorModel colorModel;
int[] bandMask;
short bitCount;
//
switch (bit) {
case 24:
pixelByte = 4;
colorModel = SCREENSHOT_COLOR_MODEL_24;
bandMask = SCREENSHOT_BAND_MASKS_24;
bitCount = 32;
break;
case 16:
pixelByte = 2;
colorModel = SCREENSHOT_COLOR_MODEL_16;
bandMask = SCREENSHOT_BAND_MASKS_16;
bitCount = 16;
break;
case 8:
pixelByte = 1;
colorModel = SCREENSHOT_COLOR_MODEL_8;
bandMask = SCREENSHOT_BAND_MASKS_8;
bitCount = 8;
break;
default:
throw new Exception("unknown bit");
}
//
BITMAPINFO bmi = new BITMAPINFO();
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = bitCount;
bmi.bmiHeader.biCompression = WinGDI.BI_RGB;
//
Memory buffer = new Memory(bufferSize * pixelByte);
GDI32.INSTANCE.GetDIBits(hdcTarget, hBitmap, 0, height, buffer, bmi, WinGDI.DIB_RGB_COLORS);
DataBuffer dataBuffer;
switch (bit) {
case 24:
dataBuffer = new DataBufferInt(buffer.getIntArray(0, bufferSize), bufferSize);
break;
case 16:
dataBuffer = new DataBufferUShort(buffer.getShortArray(0, bufferSize), bufferSize);
break;
case 8:
dataBuffer = new DataBufferByte(buffer.getByteArray(0, bufferSize), bufferSize);
break;
default:
throw new Exception("unknown bit");
}
WritableRaster raster = Raster.createPackedRaster(dataBuffer, width, height, width, bandMask, null);
GDI32.INSTANCE.DeleteObject(hBitmap);
GDI32.INSTANCE.DeleteDC(hdcTargetMem);
User32.INSTANCE.ReleaseDC(target, hdcTarget);
return new BufferedImage(colorModel, raster, false, null);
}
}