//该函数主要实现截屏功能,但我想知道其实现的原理以及步骤。
//RobotPeer和ComponentFactory是什么类呢?为什么在文档中查不到它的使用方法?
private static int[] createScreenCapture(Rectangle screenRect)
{
try
{
if (peer == null)
{
try
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (toolkit instanceof ComponentFactory)
{
peer = ((ComponentFactory) toolkit).createRobot(new Robot(),
GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getDefaultScreenDevice());
}
}
catch (Exception e)
{
}
}
return peer != null ? peer.getRGBPixels(screenRect) : null;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
//想知道这段方法实现的是什么功能?
private int[] proMinPixels(int[] newPixel, int[] oldPixel, int width, int height)
{
if (oldPixel == null || newPixel.length != oldPixel.length)
{
realNum = newPixel.length + HEADER_LEN;
buffer = new int[realNum];
buffer[0] = width;
buffer[1] = height;
buffer[4] = width;
buffer[5] = height;
System.arraycopy(newPixel, 0, buffer, HEADER_LEN, newPixel.length);
return buffer;
}
int len = newPixel.length;
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int maxX = 0;
int maxY = 0;
for (int i = 0; i < len; i++)
{
if (newPixel[i] != oldPixel[i])
{
int x = i % width;
int y = i / width;
if (x < minX)
{
minX = x;
}
if (x > maxX)
{
maxX = x;
}
if (y < minY)
{
minY = y;
}
if (y > maxY)
{
maxY = y;
}
}
}
if (minX == Integer.MAX_VALUE)
{
return null;
}
int resultWidth = maxX - minX + 1;
int resultHeight = maxY - minY + 1;
realNum = resultWidth * resultHeight + HEADER_LEN;
if (buffer.length < realNum)
{
buffer = new int[realNum];
}
buffer[0] = width;
buffer[1] = height;
buffer[2] = minX;
buffer[3] = minY;
buffer[4] = maxX + 1;
buffer[5] = maxY + 1;
int resultIndex = HEADER_LEN;
for (int i = 0; i < resultHeight; i++)
{
System.arraycopy(newPixel, (minY + i) * width + minX, buffer, resultIndex, resultWidth);
resultIndex += resultWidth;
}
return buffer;
}
/**
* 压缩数据
* @param data 需要压缩的数据
* @param x 这块数据的X坐标
* @param y 这块数据的Y坐标
* @param width 这块数据的宽度
* @param height 这快数据的高度
* @return 开头是x, y, width, height的压缩数据
*/
//该函数实现数据的压缩,但我想知道其实现的原理
private int[] compressData(int[] data)
{
if (data == null)
{
return null;
}
int compressIndex = HEADER_LEN;
int i = HEADER_LEN;
while (i < realNum)
{
int j = i;
int p = data[i];
while (++i < realNum && p == data[i]);
j = i - j;
if (j > 1)
{
buffer[compressIndex++] = j;
}
buffer[compressIndex++] = p;
}
if (compressIndex < buffer.length)
{
int[] temp = new int[compressIndex];
System.arraycopy(buffer, 0, temp, 0, compressIndex);
return temp;
}
return buffer;
}
private void writeImage(ObjectOutputStream output, int[] data) throws Exception
{
if (data == null)
{
return;
}
output.writeObject(data);
output.flush();
output.reset();
}
private static int[] tempTest;
private int realNum;
private int[] buffer;
private static final int HEADER_LEN = 6;
private int[] oldPixels;
private ObjectOutputStream output;
private Socket socket;
private static RobotPeer peer;
private BufferedImage image;
}
以上代码是从网上下载的,但不能很好的理解其中的原理以及步骤,在线等达人解!非常感谢!
//RobotPeer和ComponentFactory是什么类呢?为什么在文档中查不到它的使用方法?
private static int[] createScreenCapture(Rectangle screenRect)
{
try
{
if (peer == null)
{
try
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (toolkit instanceof ComponentFactory)
{
peer = ((ComponentFactory) toolkit).createRobot(new Robot(),
GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getDefaultScreenDevice());
}
}
catch (Exception e)
{
}
}
return peer != null ? peer.getRGBPixels(screenRect) : null;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
//想知道这段方法实现的是什么功能?
private int[] proMinPixels(int[] newPixel, int[] oldPixel, int width, int height)
{
if (oldPixel == null || newPixel.length != oldPixel.length)
{
realNum = newPixel.length + HEADER_LEN;
buffer = new int[realNum];
buffer[0] = width;
buffer[1] = height;
buffer[4] = width;
buffer[5] = height;
System.arraycopy(newPixel, 0, buffer, HEADER_LEN, newPixel.length);
return buffer;
}
int len = newPixel.length;
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int maxX = 0;
int maxY = 0;
for (int i = 0; i < len; i++)
{
if (newPixel[i] != oldPixel[i])
{
int x = i % width;
int y = i / width;
if (x < minX)
{
minX = x;
}
if (x > maxX)
{
maxX = x;
}
if (y < minY)
{
minY = y;
}
if (y > maxY)
{
maxY = y;
}
}
}
if (minX == Integer.MAX_VALUE)
{
return null;
}
int resultWidth = maxX - minX + 1;
int resultHeight = maxY - minY + 1;
realNum = resultWidth * resultHeight + HEADER_LEN;
if (buffer.length < realNum)
{
buffer = new int[realNum];
}
buffer[0] = width;
buffer[1] = height;
buffer[2] = minX;
buffer[3] = minY;
buffer[4] = maxX + 1;
buffer[5] = maxY + 1;
int resultIndex = HEADER_LEN;
for (int i = 0; i < resultHeight; i++)
{
System.arraycopy(newPixel, (minY + i) * width + minX, buffer, resultIndex, resultWidth);
resultIndex += resultWidth;
}
return buffer;
}
/**
* 压缩数据
* @param data 需要压缩的数据
* @param x 这块数据的X坐标
* @param y 这块数据的Y坐标
* @param width 这块数据的宽度
* @param height 这快数据的高度
* @return 开头是x, y, width, height的压缩数据
*/
//该函数实现数据的压缩,但我想知道其实现的原理
private int[] compressData(int[] data)
{
if (data == null)
{
return null;
}
int compressIndex = HEADER_LEN;
int i = HEADER_LEN;
while (i < realNum)
{
int j = i;
int p = data[i];
while (++i < realNum && p == data[i]);
j = i - j;
if (j > 1)
{
buffer[compressIndex++] = j;
}
buffer[compressIndex++] = p;
}
if (compressIndex < buffer.length)
{
int[] temp = new int[compressIndex];
System.arraycopy(buffer, 0, temp, 0, compressIndex);
return temp;
}
return buffer;
}
private void writeImage(ObjectOutputStream output, int[] data) throws Exception
{
if (data == null)
{
return;
}
output.writeObject(data);
output.flush();
output.reset();
}
private static int[] tempTest;
private int realNum;
private int[] buffer;
private static final int HEADER_LEN = 6;
private int[] oldPixels;
private ObjectOutputStream output;
private Socket socket;
private static RobotPeer peer;
private BufferedImage image;
}
以上代码是从网上下载的,但不能很好的理解其中的原理以及步骤,在线等达人解!非常感谢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货