请教各位大人:[跪求 + 哭求 大家帮忙看看]困扰3天2夜的问题 asp.net[不是Form] 后台截取屏幕的问题 ... 在线等待各位大人

zhgu999 2008-07-07 03:26:25
请教各位大人:困扰3天2夜的问题 asp.net[不要Form代码] 后台截取屏幕的问题 ... 在线等待各位大人

要实现的功能是 :用户上传形象照片到服务器后,这时用户在操作服务器的照片。拖动照片[比如上身部分]到指定像框里[div]
这时用户点提交后,后台自动截取 像框里的照片。
说白了就是给用户提供各web 截取屏幕的的功能....

遇到的问题是这样的 : 很多现成代码都是Form的程序,我改成asp.net 在本地好用localhost 可以截取照片
但配置上IIS 后截取后的效果是一片黑. 忘指教
代码如下


using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

//引用API
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
);


[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);

protected void Button1_Click(object sender, EventArgs e)
{
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
Bitmap MyImage = null;
MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);

//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
MyImage.Save("d:\\MyJpeg.jpeg", ImageFormat.Jpeg); //这里图片是一片黑
//MyImage.Save(Response.OutputStream, ImageFormat.Jpeg);

}




//如果截取屏幕不好用的话 ,我又用了重新生成服务器的图片 功能
//就是把原来大的图片 用户调整好后,用户按提交.我把图片按点像素生成个小的用户指定部位的图片。用户的指定图片坐标点我可以取出来,
//问题是重新生成的图片是从 坐标 0,0 位置开始的.图片大小可以控制.
// 问题是我想从中间坐标开始 生成呢 ? 怎么控制坐标呢 ..?

代码如下
Bitmap bt = new Bitmap(@"d:\photo1\200000120080313171719.jpg");

int width = 150; 这里控制图片大小.. 可是我从哪里控制图片从哪个坐标点开始生成呢.?? 2个坐标点 x轴和y轴
int height = 240;

Bitmap bt1 = new Bitmap(width, height);

//这里像素点 生成.
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
bt1.SetPixel(x, y, bt.GetPixel(x,y));
}
}

bt1.Save(Response.OutputStream,ImageFormat.Jpeg); //输出到页面呈现出来图片
bt1.Save(@"d:\9.jpg"); //保存到d盘
...全文
173 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhgu999 2008-07-07
  • 打赏
  • 举报
回复
问题已解决了 ,谢谢 【孟子E章】的图像裁剪代码 很好用...
GDI + 处理图像挺强大的.就是类太多了.错综复杂..@_@


private void cropImage()
{
System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("1.jpg"));
Rectangle cropArea = new Rectangle(20,20,100,100); //坐标和宽度高度
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea,
bmpImage.PixelFormat);
bmpCrop.Save(Server.MapPath("a.jpg"));
bmpCrop.Dispose();
bmpImage.Dispose();
img.Dispose();

}
hy_lihuan 2008-07-07
  • 打赏
  • 举报
回复
呵呵,开发原则:不要拿winform里面的操作模式使用在web上面;
你尽量不要在页面级来处理图片这样的问题,如果一定要,那希望选择RIA开发
crescens 2008-07-07
  • 打赏
  • 举报
回复
mark
zhouyongli41 2008-07-07
  • 打赏
  • 举报
回复
学习
孟子E章 2008-07-07
  • 打赏
  • 举报
回复
图像裁剪代码

private void cropImage()
{
System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("1.jpg"));
Rectangle cropArea = new Rectangle(20,20,100,100); //坐标和宽度高度
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea,
bmpImage.PixelFormat);
bmpCrop.Save(Server.MapPath("a.jpg"));
bmpCrop.Dispose();
bmpImage.Dispose();
img.Dispose();

}
孟子E章 2008-07-07
  • 打赏
  • 举报
回复
你不应当采用截屏的方法,而是将用户选择的图片范围和起始点记录下来,提交到服务器,在服务器端采用GDi+对图片进行处理
hubblebubblepig 2008-07-07
  • 打赏
  • 举报
回复
你现在可以获得到用户指定的"初始位置"吗?(图片框入相框中的左上角坐标?!)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧