C++图像处理函数
// TestBitMap.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include
#include
#include
extern "C" int _declspec (dllexport) readBitmap(void ** pBmpBuf,BITMAPINFO &bm);
int _declspec (dllexport) readBitmap(void ** pBmpBuf,BITMAPINFO &bm)
{
FILE *fp=fopen("工区0110.bmp","rb");//二进制读方式打开指定的图像文件
if(fp==0) return 0;
//跳过位图文件头结构BITMAPFILEHEADER
// fseek(fp, sizeof(BITMAPFILEHEADER),0);
BITMAPFILEHEADER bmpFileHeader;
fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER bmpInfoHeader;
fread(&bmpInfoHeader, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息
int bmpWidth = bmpInfoHeader.biWidth;
int bmpHeight = bmpInfoHeader.biHeight;
int biBitCount = bmpInfoHeader.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256
bm.bmiHeader = bmpInfoHeader;
if(biBitCount==8)
{
//申请颜色表所需要的空间,读颜色表进内存
RGBQUAD *pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
delete []pColorTable;
}
//申请位图数据所需要的空间,读位图数据进内存
// pBmpBuf=new unsigned char[lineByte * bmpHeight];
// *pBmpBuf = malloc(lineByte*bmpHeight);
// if (*pBmpBuf == NULL)
// {
// return -1;
// }
fread(*pBmpBuf,1,lineByte * bmpHeight,fp);
fclose(fp);//关闭文件
return 1;//读取文件成功
}
C# 调用
[DllImport("TestBitMap", EntryPoint = "readBitmap",CallingConvention = CallingConvention.Cdecl)]
public static extern int readBitmap(ref IntPtr a,ref BITMAPINFO bm);
public int getBitmap()
{
BITMAPINFO bm = new BITMAPINFO();
// int d = 0;
IntPtr e = Marshal.AllocHGlobal(3000*89);//3000*89为实际位图数据的大小
int x = readBitmap(ref e,ref bm);
int bmpWidth = bm.bmiHeader.biWidth;
int bmpHeight = bm.bmiHeader.biHeight;
int bmpBitCount = bm.bmiHeader.biBitCount;
int stride = (bmpWidth * bmpBitCount / 8 + 3) / 4 * 4;
Bitmap bt = new Bitmap(bmpWidth, bmpHeight, stride, PixelFormat.Format24bppRgb, e);//存储为24位图像
bt.Save("testBt.bmp");
//其他操作
int x = readBitmap(ref e,ref bm);
// Bitmap bt1 = new Bitmap("工区0110.bmp");
// Bitmap bt2 = new Bitmap("工区0120.bmp");
// BitmapData bd = new BitmapData();
// Rectangle rect = new Rectangle(0, 0, bt1.Width, bt1.Height);
// System.Drawing.Imaging.BitmapData bmpData1 =
//bt1.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
//bt1.PixelFormat);
// System.Drawing.Imaging.BitmapData bmpData2 =
//bt2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
//bt2.PixelFormat);
// bmpData1 = bmpData2;
// int bytes = bmpData1.Stride * bmpData1.Height;
// byte[] rgbValues = new byte[bytes];
// IntPtr testptr = bmpData1.Scan0;
// Marshal.Copy(bmpData1.Scan0, rgbValues, 0, bytes);
// Marshal.Copy(rgbValues, 0, bmpData2.Scan0, bytes);
//// Marshal.Copy(bmpData1.Scan0, 0, bmpData2.Scan0, bmpData1.Stride * bmpData1.Height);
// // bmpData2.Scan0 = bmpData1.Scan0;
// bt1.UnlockBits(bmpData2);
// bt2.UnlockBits(bmpData1);
// bt1.Save("testBt1.bmp");
// bt2.Save("testBt2.bmp");
// // Create a new bitmap.
// Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");
// // Lock the bitmap's bits.
// Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
// System.Drawing.Imaging.BitmapData bmpData =
// bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
// bmp.PixelFormat);
// // Get the address of the first line.
//IntPtr ptr = bmpData.Scan0;
// // Declare an array to hold the bytes of the bitmap.
// int bytes = bmpData.Stride * bmp.Height;
// byte[] rgbValues = new byte[bytes];
// // Copy the RGB values into the array.
// System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
// // Set every red value to 255.
// for (int counter = 0; counter < rgbValues.Length; counter+=3)
// rgbValues[counter] = 255;
// // Copy the RGB values back to the bitmap
// System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
// // Unlock the bits.
// bmp.UnlockBits(bmpData);
// // Draw the modified image.
// e.Graphics.DrawImage(bmp, 0, 150);
}