C++基于Directx MMX实现的图像灰度转换代码

本文实例讲述了基于Directx MMX 编写的实现图像灰度处理的方法,要编译此程序需DirectX SDK5.0,代码中所需要的ddutil.h与ddutil.cpp文件,请自行下载加入工程。在WindowNT4.0+SP3环境中编译通过,代码已经过整理,包含有注释。如下所示:

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>
#include <math.h>
#include "ddutil.h"
#define MEAN_GRAY 0//平均值法
#define MAXIMUM_GRAY 1//最大值法
#define WEIGHT_GRAY 2//加权平均值法
#define TITLE "灰度转换" //窗口标题
#define CLASSNAME "Gray" //窗口类名
#define WIDTH 640
#define HEIGHT 480
#define COLORS 8
#define STEP 1
#define SCANLINE 16
HINSTANCE hInst; //应用程序实例句柄
HWND hWndMain; //主窗口句柄
LPDIRECTDRAW      lpDD;      // DirectDraw对象
LPDIRECTDRAWSURFACE   lpDDSPrimary;  // 主页面
LPDIRECTDRAWSURFACE   lpDDSBack;   // 后台缓冲区
LPDIRECTDRAWSURFACE   lpDDSPic1;   // 离屏页面1
LPDIRECTDRAWPALETTE   lpDDPal;    // 调色板
BOOL          bActive;    // 应用程序是否活跃?
int Key=0;
bool Contrast=false;
bool Gray=false;
//函数声明
void FreeObjects( void );
BOOL InitDDraw(void);
BOOL InitPalette(void);
BOOL InitSurfaces(void);
void UpdateFrame(void);
void MakeRect(RECT *rect, long left, long top, long right, long bottom);
void IncreaseContrast(BYTE *pByte,const int Low,const int Hight,
    const float Grad)
{
 if(*pByte<=Low)
 *pByte=0;
 else if((Low<*pByte)&&(*pByte<Hight))
 *pByte=(BYTE)((*pByte-Low)/Grad);
 else
 *pByte=255;
}
void ChangeContrast(int nDelta)
{
 LPPALETTEENTRY Pal = (LPPALETTEENTRY) LocalAlloc( LPTR, sizeof( PALETTEENTRY ) * 256 );
 //获取调色板
 lpDDPal->GetEntries(0,0,256,Pal);
 int Low,High;
 float Grad;
 for(int i=0; i<256; i++)
 {
 if(nDelta>=0)
 {
  Low=0+nDelta;
  High=255-nDelta;
  Grad=((float)(High-Low))/255;
  IncreaseContrast(&Pal[i].peRed ,Low,High,Grad);
  IncreaseContrast(&Pal[i].peGreen ,Low,High,Grad);
  IncreaseContrast(&Pal[i].peBlue ,Low,High,Grad);
 }
 else
 {
  Pal[i].peRed=(BYTE)((int)(Pal[i].peRed/Grad))-nDelta;
  Pal[i].peGreen=(BYTE)((int)(Pal[i].peGreen/Grad))-nDelta;
  Pal[i].peBlue=(BYTE)((int)(Pal[i].peBlue/Grad))-nDelta;
 }
 }
 //更新调色板
 lpDDPal->SetEntries(0,0,256,Pal);
}
//灰度转换函数--本程序的关键
//函数:ConvertToGrayScale
//参数:Method为转换灰度的方式,值可为:
// MAXIMUM_GRAY=最大值法,MEAN_GRAY=平均值法,
// WEIGHT_GRAY=加权平均值法
// Color目前只能为8即只能处理8位调色板方式
//返值:无
void ConvertToGrayScale(unsigned short Method,unsigned short Color)
{
 BYTE Convert;
 int i;
 switch(Color)
 {
 case 8:
 LPPALETTEENTRY Pal = (LPPALETTEENTRY) LocalAlloc( LPTR, sizeof( PALETTEENTRY ) * 256 );
 //获取调色板
 lpDDPal->GetEntries(0,0,256,Pal);
 switch(Method)
 {
 case MAXIMUM_GRAY:
  //最大值法转换
  for(i=0; i<256; i++)
  {
  //计算的公式为:R=G=B=max(R,G,B)
  Convert=( max(max(Pal[i].peRed ,Pal[i].peGreen),Pal[i].peBlue));
  Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=Convert;
  }
  break;
 case MEAN_GRAY:
  //平均值法转换
  for(i=0; i<256; i++)
  {
  //计算的公式为:R=G=B=(R+G+B)/3
  Convert=((Pal[i].peRed +Pal[i].peGreen+Pal[i].peBlue)/3);
  Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=Convert;
  }
  break;
 case WEIGHT_GRAY:
  //加权平均值法转换
  for(i=0; i<256; i++)
  {
  //计算的公式为:R=G=B=(R*0.3+G*0.59+B*0.11)
  //为不使用浮点乘法,现公式为:
  //R=G=B=(R*3+G*6+B)/10
  //些许的误差可以不计
  Convert=( Pal[i].peRed * 3 + Pal[i].peGreen *6 + Pal[i].peBlue ) / 10;
  Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=Convert;
  }
  break;
 }
 //更新调色板
 lpDDPal->SetEntries(0,0,256,Pal);
 break;
 }
}
//**********************************
//函数:FreeObject
//功能:释放所有DirectDraw对象
void FreeObjects( void )
{
  if( lpDD != NULL )//释放DirectDraw对象
  {
    if( lpDDSPrimary != NULL )//释放主页面
    {
      lpDDSPrimary->Release();
      lpDDSPrimary = NULL;
    }
    if( lpDDSPic1 != NULL )//释放离屏页面1
    {
      lpDDSPic1->Release();
      lpDDSPic1 = NULL;
    }
    if( lpDDPal != NULL )//释放调色板
    {
      lpDDPal->Release();
      lpDDPal = NULL;
    }
    lpDD->Release();
    lpDD = NULL;
  }
}
//************************************
//函数:RestoreAll
//功能:页面丢失后,恢复页面内存
HRESULT RestoreAll( void )
{
  HRESULT   ddrval;
 //恢复主页面,这也将恢复换页链中的所有页面
  ddrval = lpDDSPrimary->Restore();
 //恢复离屏页面
  ddrval = lpDDSPic1->Restore();
 //重新绘制页面图象
 InitSurfaces();
  return ddrval;
}
//**************************************
//函数:WindowProc
//功能:主窗口的消息处理过程
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
  switch( message )
  {
  case WM_SETCURSOR:
 SetCursor(NULL);
 return TRUE;

  case WM_ACTIVATEAPP://应用程序激活消息
    bActive = wParam;
    break;

  case WM_KEYDOWN://击键消息
    switch( wParam )
    {
    case VK_ESCAPE:
      PostMessage(hWnd, WM_CLOSE, 0, 0);
      break;
 case VK_F1:
  Gray=true;
  Key=MEAN_GRAY;
  InitPalette();
  break;
 case VK_F2:
  Gray=true;
  Key=MAXIMUM_GRAY;
  InitPalette();
  break;
 case VK_F3:
  Gray=true;
  Key=WEIGHT_GRAY;
  InitPalette();
  break;
 case VK_F4:
  Gray=false;
  Key=0;
  InitPalette();
  break;
 case VK_F5:
  Contrast=!Contrast;
  if(false==Contrast)
  {
  InitPalette();
  }
  break;
 case VK_F6:
  break;
 }
    break;

  case WM_DESTROY://销毁窗口消息
    FreeObjects();
    PostQuitMessage(0);
    break;
  }

 //调用缺省的过程处理过程
  return DefWindowProc(hWnd, message, wParam, lParam);
}
//*********************************
//函数:InitWindow()
//功能:创建主窗口。
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
  WNDCLASS wc; //窗口类结构
 //填充窗口类结构
  wc.style = 0;
  wc.lpfnWndProc = WinProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
  wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//选择黑色刷做为窗口背景
  wc.lpszMenuName = NULL;
 wc.lpszClassName = CLASSNAME;
 //注册窗口类
  RegisterClass( &wc );
  //创建主窗口
  hWndMain= CreateWindowEx(
 0,
 CLASSNAME, //窗口的类名称,必须与上面的wc.lpszClassName一致
 TITLE, //窗口的标题名
 WS_POPUP,
 0,
 0,
 GetSystemMetrics( SM_CXSCREEN ),
 GetSystemMetrics( SM_CYSCREEN ),
 NULL,
 NULL,
 hInstance,
 NULL );
  if( !hWndMain )
 return FALSE;
 //显示并更新窗口
  ShowWindow( hWndMain, nCmdShow );
 return TRUE;
}
//*********************************
//函数:InitDDraw()
//功能:初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区)
// 以及创建一个定时器。
BOOL InitDDraw(void)
{
  DDSURFACEDESC    ddsd;
  DDSCAPS       ddscaps;
  HRESULT       ddrval;

  //创建DirectDraw对象
 ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
  if( ddrval != DD_OK )
    return FALSE;
  //取得全屏独占模式
  ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
  if( ddrval != DD_OK )
    return FALSE;
  //设置显示器显示模式为640x480x8
  ddrval = lpDD->SetDisplayMode( WIDTH, HEIGHT, COLORS);
  if( ddrval != DD_OK )
    return FALSE;
  //填充换页链结构
  ddsd.dwSize = sizeof( ddsd );
  ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
             DDSCAPS_FLIP |
             DDSCAPS_COMPLEX;
 //后台缓冲区数量为1
  ddsd.dwBackBufferCount = 1;
 //创建换页链,包括了主页面及其后台缓冲区
  ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
  if( ddrval != DD_OK )
    return FALSE;
  //获得指向后台缓冲区的页面指针
 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
  if( ddrval != DD_OK )
    return FALSE;
 //创建离屏页面
 ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize = sizeof(ddsd);
  ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
  ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  ddsd.dwWidth = WIDTH;
  ddsd.dwHeight = HEIGHT;
  if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
 return FALSE;
 //调用页面初始化函数
 if( !InitSurfaces() )
    return FALSE;
  return TRUE;
}
//**********************************
//函数:WinMain()
//功能:应用程序入口
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
 hInst=hInstance;
 //初始化主窗口
 if (!InitWindow( hInstance, nCmdShow))
  return FALSE;
 //初始化DirectDraw环境
 if (!InitDDraw())
 {
 MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
 FreeObjects();
 DestroyWindow(hWndMain);
 return FALSE;
 }
 //进入消息循环
 while(1)
 {
 if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
 {
  if(!GetMessage(&msg, NULL, 0, 0 ))
  return msg.wParam;
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 else if(bActive)
 {
  UpdateFrame();
 }
 else WaitMessage();
 }
  return msg.wParam;
}
BOOL InitPalette(void)
{
  //从磁盘文件中载入调色板
 lpDDPal = DDLoadPalette(lpDD, "back.bmp");
 //将调色板设置给主页面
  if (lpDDPal)
 {
    lpDDSPrimary->SetPalette( lpDDPal );
 return TRUE;
 }
 return FALSE;
}
//****************************
//函数:InitSurfaces()
//功能:初始化页面图象
BOOL InitSurfaces( void )
{
  HBITMAP hbm;
 InitPalette();
  //从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
  hbm = (HBITMAP)LoadImage(hInst, "back.bmp", IMAGE_BITMAP,
 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
  if (hbm == NULL)
 return FALSE;
 DDCopyBitmap(lpDDSPic1, hbm, 0, 0, WIDTH, HEIGHT);
 //释放hbm位图对象
  DeleteObject(hbm);
  return TRUE;
}
//更新屏幕
void UpdateFrame( void )
{
 HRESULT ddrval;
 //计算刷新率
 static int fps=0, frame=0, nt=0, ot=0;
 frame++;
 nt=timeGetTime();
 if (nt > ot+1000)
 {
 ot=nt;
 fps=frame;
 frame=0;
 }
 //清屏后台缓冲区
 DDBLTFX ddBltFx;
 ddBltFx.dwSize = sizeof(DDBLTFX);
 ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
 lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
 //调用灰度的实现函数
 if(true==Gray)
 {
 ConvertToGrayScale(Key,COLORS);
 Gray=false;
 }
 //增加对比度
 if(true==Contrast)
 {
 ChangeContrast(2);
 }

 RECT srect, drect;
 MakeRect(&srect, 0, 0, WIDTH, HEIGHT);
 MakeRect(&drect, 0, 0, WIDTH, HEIGHT);
 //将背景图象Blit到后台缓冲区
 lpDDSBack->Blt(&drect, lpDDSPic1, &srect, DDBLT_WAIT, NULL);
 //打印刷新率fps
 HDC hdc;
 char temp[50];
 lpDDSBack->GetDC(&hdc);
 SetBkMode(hdc, TRANSPARENT);
 SetTextColor(hdc, RGB(0,255,255));
 sprintf(temp, "fps=%d", fps);
 TextOut(hdc, 0, 0, temp, strlen(temp));
 sprintf(temp,"图象特效----灰度转换");
 TextOut(hdc, 30, 400, temp, strlen(temp));
 lpDDSBack->ReleaseDC(hdc);
  // 换页
  while( 1 )
  {
    ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );//调用换页函数
    if( ddrval == DD_OK )//成功则退出while循环
      break;
    else if( ddrval == DDERR_SURFACELOST )//如果页面丢失,则恢复页面,再继续while循环
      RestoreAll();
    else
  break;
 }
}
void MakeRect(RECT *rect, long left, long top, long right, long bottom)
{
 rect->left=left;
 rect->top=top;
 rect->right=right;
 rect->bottom=bottom;
}

感兴趣的朋友可以调试运行一下本文实例,相信会对大家进行C++项目开发起到一定的帮助作用。

(0)

相关推荐

  • C语言读取BMP图像数据的源码

    复制代码 代码如下: /* File name:   bmpTest.c   Author:      WanChuan XianSheng    Date:        Oct 01, 2011   Description: Show all Info a bmp file has. including    FileHeader Info, InfoHeader Info and Data Part. Reference: BMP图像数据的C语言读取源码*/ #include <stdio

  • C++将CBitmap类中的图像保存到文件的方法

    本文实例讲述了C++将CBitmap类中的图像保存到文件的方法.分享给大家供大家参考.具体实现方法如下: 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中.支持格式:BMP.JPG.GIF和PNG. void SaveBitmap(CString strFilePath, CBitmap Bitmap) { if ( Bitmap.m_hObject ) { CImage imgTemp; // CImage是MFC中的类. imgTemp.Attach(Bitmap.operat

  • c语言常见图片格式判断实例

    我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我用的方法是读取图片头文件中的标识符: 复制代码 代码如下: unsigned short  BMP=0x4D42,JPG=0xD8FF,PNG[4]={0x5089,0x474E,0x0A0D,0x0A1A},GIF[3]={0x4947,0x3846,0x6139}; 你会发现,会一次读取n个字节的顺序不同:与用"okhi

  • C语言中打印特殊图案的实现代码

    代码如下所示: 复制代码 代码如下: #include <stdio.h> int main(){ // 主要是找到行和列的关系   int i,j,k;      for(i=0;i<4;i++)  //做为行循环   {    for(j=0;j<=2-i;j++)  // 打印一行中的空白     printf(" ");    for(k=0;k<=2*i;k++)  //打印一行中*号     printf("*");   

  • C语言实现的bitmap位图代码分享

    事实上,我们是用每一个 元素表示一个32位的二进制字符串,这样这个元素可以保留相邻32个号码是否存在的信息,数组范围就下降到10000000/32了.例如对于号码 89256,由于89256 mod 32=2789-8,这样我们应该置a[2789]中32位字符串的第8位(从低位数起)为1. #define WORD 32 #define SHIFT 5 ////移动5个位,左移则相当于乘以32,右移相当于除以32取整 #define MASK 0x1F //16进制下的31 #define N

  • C语言位图算法详解

    本文详细讲述了位图算法的定义与C语言实现方法,分享给大家供大家参考之用.具体如下: 位图法定义: 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作.   数据结构: unsigned int bit[N]; 在这个数组

  • C++中Cbitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad): LoadImage可以用来加载位图,图标和光标 加载时可以规定加载图的映射到内存的大小: cxDesired:指定图标或光标的宽度,以像素为单位.如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度.

  • C++基于Directx MMX实现的图像灰度转换代码

    本文实例讲述了基于Directx MMX 编写的实现图像灰度处理的方法,要编译此程序需DirectX SDK5.0,代码中所需要的ddutil.h与ddutil.cpp文件,请自行下载加入工程.在WindowNT4.0+SP3环境中编译通过,代码已经过整理,包含有注释.如下所示: #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <ddraw.h> #include

  • Python图像运算之图像灰度线性变换详解

    目录 一.灰度线性变换 二.图像灰度上移变换 三.图像对比度增强变换 四.图像对比度减弱变换 五.图像灰度反色变换 六.总结 一.灰度线性变换 图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度.灰度线性变换的计算公式如(12-1)所示: 该公式中DB表示灰度线性变换后的灰度值,DA表示变换前输入图像的灰度值,α和b为线性变换方程f(D)的参数,分别表示斜率和截距[1-4]. 当α=1,b=0时,保持原始图像 当α=1,b!=0时,图像

  • Python图像运算之图像灰度非线性变换详解

    目录 一.图像灰度非线性变换 二.图像灰度对数变换 三.图像灰度伽玛变换 四.总结 一.图像灰度非线性变换 原始图像的灰度值按照DB=DA×DA/255的公式进行非线性变换,其代码如下: # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #读取原始图像 img = cv2.imread('luo.png') #图像灰度转换 grayImage =

  • Python图像运算之图像灰度直方图对比详解

    目录 一.灰度增强直方图对比 二.灰度减弱直方图对比 三.图像反色直方图对比 四.图像对数变换直方图对比 五.图像阈值化处理直方图对比 六.总结 一.灰度增强直方图对比 图像灰度上移变换使用的表达式为: DB=DA+50 该算法将实现图像灰度值的上移,从而提升图像的亮度,结合直方图对比的实现代码如下所示. # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as

  • 基于Qt OpenCV的图像灰度化像素操作详解

    效果图 实现代码 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<opencv2/opencv.hpp> using namespace cv; QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *

  • 基于c#图像灰度化、灰度反转、二值化的实现方法详解

    图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些.灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征.图像的灰度

  • 基于Python的OpenCV骨架化图像并显示(skeletonize)

    1. 效果图 自己画一张图,原图 VS 骨架效果图如下: opencv logo原图 VS 骨架化效果图如下: 2. 源码 # 图像骨架化~ import cv2 import imutils import numpy as np img = np.zeros((390, 390, 3), dtype="uint8") cv2.putText(img, "Beautiful Girl.....", (50, 190), cv2.FONT_HERSHEY_SIMPLE

  • 基于Python和openCV实现图像的全景拼接详细步骤

    基本介绍 图像的全景拼接,即"缝合"两张具有重叠区域的图来创建一张全景图.其中用到了计算机视觉和图像处理技术有:关键点检测.局部不变特征.关键点匹配.RANSAC(Random Sample Consensus,随机采样一致性)和透视变形. 具体步骤 (1)检测左右两张图像的SIFT关键特征点,并提取局部不变特征 : (2)使用knnMatch检测来自右图(左图)的SIFT特征,与左图(右图)进行匹配 : (3)计算视角变换矩阵H,用变换矩阵H对右图进行扭曲变换: (4)将左图(右图)

  • PHP基于phpqrcode生成带LOGO图像的二维码实例

    本文实例讲述了PHP基于phpqrcode生成带LOGO图像的二维码.分享给大家供大家参考.具体如下: 这里PHP使用phpqrcode生成带LOGO图像的二维码,使用起来很方便,代码中含 生成不带Logo的标准二维码和生成带Logo的二维码,可根据注释修改使用. <?php include ('phpqrcode.php'); $value = 'http://www.codesc.net';//二维码数据 $errorCorrectionLevel = 'L';//纠错级别:L.M.Q.H

  • C#数字图象处理之图像灰度化方法

    本文实例讲述了C#数字图象处理之图像灰度化方法.分享给大家供大家参考.具体如下: //定义图像灰度化函数 private static Bitmap PGray(Bitmap src) { int w = src.Width; int h = src.Height; //构建与原图像大小一样的模版图像 Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format24bp

随机推荐