C++截图程序
求大神写一个C/C++程序,实现与以下的java程序相同的功能!大致描述:使用管道通信,父进程输入要截取的屏幕范围,返回图像的字节数组。成功以后重赏~谢谢!package...
求大神写一个C/C++程序,实现与以下的java程序相同的功能!
大致描述:使用管道通信,父进程输入要截取的屏幕范围,返回图像的字节数组。
成功以后重赏~谢谢!
package;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.imageio.ImageIO;
public class ScreenShot {
private static int width = 130;
private static int height = 110;
private static int x = 50;
private static int y = 50;
private Robot robot;
/**
* 要创建的图片的类型,可以是PNG,GIF或其它
*/
private String imageType = "png";
/**
* @param 捕捉屏幕宽度
* @param 捕捉屏幕高度
* @param args
*/
public static void main(String[] args) {
if (args.length == 2) {
width = Integer.parseInt(args[0]);
height = Integer.parseInt(args[1]);
}
ScreenShot s = new ScreenShot();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String text = "";
String[] tokens;
while (true) {
try {
text = in.readLine();
if (text.equals("take")) {
s.capturePortion(x, y, width, height);
}
else if (text.equals("terminate")) {
return;
}
else if (text.length() > 0)
{
tokens = text.split(" ");
if (tokens.length < 4)
continue;
x = Integer.parseInt(tokens[0]);
y = Integer.parseInt(tokens[1]);
width = Integer.parseInt(tokens[2]);
height = Integer.parseInt(tokens[3]);
}
}
catch (IOException e) {
System.err.println("Exception while reading the input. " + e);
}
}
}
/**
* 获取屏幕某个区域的截图
*/
public void capturePortion(int x, int y, int w, int h) {
try {
if (robot == null)
robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(img, imageType, output);
DataOutputStream dataOutputStream = new DataOutputStream(System.out);
//输出流的长度
//dataOutputStream.writeInt(output.size());
//输出流/
dataOutputStream.write(output.toByteArray());
dataOutputStream.flush();
output.close();
} catch (AWTException e) {
System.err.println("Exception while capturing screen. " + e);
} catch (IOException e) {
System.err.println("Exception while writting the image bytes. " + e);
}
}
} 展开
大致描述:使用管道通信,父进程输入要截取的屏幕范围,返回图像的字节数组。
成功以后重赏~谢谢!
package;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.imageio.ImageIO;
public class ScreenShot {
private static int width = 130;
private static int height = 110;
private static int x = 50;
private static int y = 50;
private Robot robot;
/**
* 要创建的图片的类型,可以是PNG,GIF或其它
*/
private String imageType = "png";
/**
* @param 捕捉屏幕宽度
* @param 捕捉屏幕高度
* @param args
*/
public static void main(String[] args) {
if (args.length == 2) {
width = Integer.parseInt(args[0]);
height = Integer.parseInt(args[1]);
}
ScreenShot s = new ScreenShot();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String text = "";
String[] tokens;
while (true) {
try {
text = in.readLine();
if (text.equals("take")) {
s.capturePortion(x, y, width, height);
}
else if (text.equals("terminate")) {
return;
}
else if (text.length() > 0)
{
tokens = text.split(" ");
if (tokens.length < 4)
continue;
x = Integer.parseInt(tokens[0]);
y = Integer.parseInt(tokens[1]);
width = Integer.parseInt(tokens[2]);
height = Integer.parseInt(tokens[3]);
}
}
catch (IOException e) {
System.err.println("Exception while reading the input. " + e);
}
}
}
/**
* 获取屏幕某个区域的截图
*/
public void capturePortion(int x, int y, int w, int h) {
try {
if (robot == null)
robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(img, imageType, output);
DataOutputStream dataOutputStream = new DataOutputStream(System.out);
//输出流的长度
//dataOutputStream.writeInt(output.size());
//输出流/
dataOutputStream.write(output.toByteArray());
dataOutputStream.flush();
output.close();
} catch (AWTException e) {
System.err.println("Exception while capturing screen. " + e);
} catch (IOException e) {
System.err.println("Exception while writting the image bytes. " + e);
}
}
} 展开
1个回答
展开全部
#include <afxwin.h>
void Screen(char filename[])
{
CDC *pDC;//屏幕DC
pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);
printf("当前屏幕色彩模式为%d位色彩\n", BitPerPixel);
printf("屏幕宽度:%d\n", Width);
printf("屏幕高度:%d\n", Height);
CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);
CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC
//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息
FILE *fp = fopen(filename, "w+b");
BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据
delete [] p;
fclose(fp);
memDC.SelectObject(oldmemBitmap);
}
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY); 里的参数自己设置
void Screen(char filename[])
{
CDC *pDC;//屏幕DC
pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);
printf("当前屏幕色彩模式为%d位色彩\n", BitPerPixel);
printf("屏幕宽度:%d\n", Width);
printf("屏幕高度:%d\n", Height);
CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);
CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC
//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息
FILE *fp = fopen(filename, "w+b");
BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据
delete [] p;
fclose(fp);
memDC.SelectObject(oldmemBitmap);
}
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY); 里的参数自己设置
追问
您好!谢谢你的截图函数!还有一点,我希望是可以通过管道通信控制,这一块我完全一窍不通,能不能麻烦再帮我加上这个模块= =
也就是说,我有一个别的语言写的程序,然后这个程序启动一个C程序并与之建立管道通信,然后当主程序向C程序的StandardDataInput(标准输入流)里写入一个包含x,y,width,height的命令时,该程序能够将当前屏幕的位图数据通过StandardDataOutput(标准输出流)输出。
谢谢!
追答
一个程序启动另一个程序时应该可以带参数。要建立管道通信,你自己查资料吧。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询