首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#拍照后如何改变分辨率

2012-10-18 
C#拍照后怎么改变分辨率?我用的是这个调用摄像头的类:using Systemusing System.Collections.Genericusi

C#拍照后怎么改变分辨率?
我用的是这个调用摄像头的类:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;

namespace WindowsApplication6
{
  /// <summary>  
  /// 一个控制摄像头的类  
  /// </summary>  
  public class cVideo
  {
  //导入API函数
  [DllImport("avicap32.dll")]
  private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
  [DllImport("avicap32.dll")]
  private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
  [DllImport("User32.dll")]
  private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
  //常量设置
  private const int WM_USER = 0x400;
  private const int WS_CHILD = 0x40000000;
  private const int WS_VISIBLE = 0x10000000;
  private const int WM_CAP_START = WM_USER;
  private const int WM_CAP_STOP = WM_CAP_START + 68;
  private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
  private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
  private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
  private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
  private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
  private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
  private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
  private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
  private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
  private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
  private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
  private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
  private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
  private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
  private const int WM_CAP_FILE_SAVEAS = WM_CAP_START + 23; //将捕捉文件保存为另一个用户指定的文件。这个消息不会改变捕捉文件的名字和内容,

  //全局变量
  private IntPtr hWndC; //句柄
  private IntPtr mControlPtr; //句柄
  private bool bWorkStart = false;
  private int mWidth;  //视频显示宽度
  private int mHeight; //视频显示高度
  private int mLeft; //视频显示左边距
  private int mTop; //视频显示上边距
  /// <summary>  
  /// 初始化显示图像  
  /// </summary>  
  /// <param name="handle">播放视频控件的句柄</param>  
  /// <param name="left">视频显示的左边距</param>  
  /// <param name="top">视频显示的上边距</param>
  /// <param name="down">视频显示的下边距</param>
  /// <param name="right">视频显示的右边距</param>
  /// <param name="width">要显示视频的宽度</param>  
  /// <param name="height">要显示视频的长度</param>  
  public cVideo(IntPtr handle, int left, int top, int width, int height)
  {
  mControlPtr = handle;
  mWidth = width;
  mHeight = height;
  mLeft = left;


  mTop = top;
  }
  /// <summary>  
  /// 打开视频 
  /// </summary>  
  public void StartVideo()
  {
  if (bWorkStart)
  return;
  bWorkStart = true;
  byte[] lpszName = new byte[100];
  //创建播放窗口
  hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);

  if (hWndC.ToInt32() != 0)
  {
  //显示视频
  SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
  SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
  SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
  SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
  SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
  SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 100, 0);
  SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
  SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
  }
  }
  /// <summary>  
  /// 关闭视频  
  /// </summary>  
  public void StopVideo()
  {
  SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
  bWorkStart = false;
  }

  /// <summary>
  /// 拍照
  /// </summary>
  /// <param name="path">文件路径</param>
  public void Images(string path)
  {
  IntPtr imagePath = Marshal.StringToHGlobalAnsi(path);
  SendMessage(hWndC, WM_CAP_SAVEDIB, 0, imagePath.ToInt32());
  }

  }
}
拍照完成后就是不知道怎么改变照片的分辨率。。望给予指点。。。

[解决办法]
是要缩小图片吗?
按照比例缩小就行了。
刚从另外一个帖子看到的。
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace Common
{
public class ImageMes
{
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径</param>
/// <param name="thumbnailPath">缩略图路径</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式:HW指定高宽缩放(可能变形);W指定宽,高按比例 H指定高,宽按比例 Cut指定高宽裁减(不变形)</param>  
/// <param name="mode">要缩略图保存的格式(gif,jpg,bmp,png) 为空或未知类型都视为jpg</param>  
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode, string imageType)
{
Image originalImage = Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;

switch (mode)
{
case "HW"://指定高宽缩放(可能变形)        
break;
case "W"://指定宽,高按比例          
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;


break;
case "Cut"://指定高宽裁减(不变形)        
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//新建一个bmp图片
Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);

//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充
g.Clear(Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);

try
{
//以jpg格式保存缩略图
switch (imageType.ToLower())
{
case "gif":
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Gif);
break;
case "jpg":
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case "bmp":
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Bmp);
break;
case "png":
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png);
break;
default:
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
}
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
}
}

热点排行