c#pda(wince)摄像头拍照程序

时间:2023-01-21 17:49:13

拍照时经常报内存溢出的错误,没有找到原因

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using Microsoft.Win32;
using System.Diagnostics;

namespace Camera300
{
   public  class Camera
    {
        //打开设备
        [DllImport("CameraDll.dll", EntryPoint = "CIS_OpenDevice", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool CIS_OpenDevice();
        //关闭设备
        [DllImport("CameraDll.dll", EntryPoint = "CIS_CloseDevice", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_CloseDevice();
        //设置自动调节
        [DllImport("CameraDll.dll", EntryPoint = "CIS_SetAuto", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_SetAuto(bool f);
        //设置保存图片大小
        [DllImport("CameraDll.dll", EntryPoint = "CIS_SetImageSize", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool CIS_SetImageSize(byte bMode);
        //得到保存图片大小
        [DllImport("CameraDll.dll", EntryPoint = "CIS_GetImageSize", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int CIS_GetImageSize();

        //得到是否全屏
        [DllImport("CameraDll.dll", EntryPoint = "CIS_GetIsAuto", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool CIS_GetIsAuto();
        //增益增
        [DllImport("CameraDll.dll", EntryPoint = "CIS_UpGainLight", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int CIS_UpGainLight(int nBit);
        //增益减
        [DllImport("CameraDll.dll", EntryPoint = "CIS_DownGainLight", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int CIS_DownGainLight(int nBit);
        //设置增益
        [DllImport("CameraDll.dll", EntryPoint = "CIS_SetGainLight", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int CIS_SetGainLight(int nBit);

        //旋屏
        [DllImport("CameraDll.dll", EntryPoint = "CIS_Rotate", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_Rotate();
        //暂停显示
        [DllImport("CameraDll.dll", EntryPoint = "CIS_Pause", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_Pause();
        //开始
        [DllImport("CameraDll.dll", EntryPoint = "CIS_Play", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_Play();
        //设置是否全屏显示
        [DllImport("CameraDll.dll", EntryPoint = "CIS_SetFullScreen", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_SetFullScreen(int nFull);
        //拍照
        [DllImport("CameraDll.dll", EntryPoint = "CIS_Photograph", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_Photograph(IntPtr lpBuffer);
        //设置显示位置
        [DllImport("CameraDll.dll", EntryPoint = "CIS_SetPreview", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_SetPreview(int nX, int nY, int nPreviewWidth, int nPreviewHeight);
        //打开电源
        [DllImport("CameraDll.dll", EntryPoint = "CIS_UP", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_UP();
        //断开电源
        [DllImport("CameraDll.dll", EntryPoint = "CIS_DOWN", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern void CIS_DOWN();
        [DllImport("coredll.dll")]
        private static extern Int32 PlaySound(string strfile, uint hmod, playMode fdwSound);
        //本来是想用C#里得函数来播放的,看看好像那个名空间在windowce上不存在,就用系统API吧,他们最终调用的韩式这个函数
        enum playMode
        {
            SND_ALIAS = 0x00010000,  // name is a WIN.INI [sounds] entry
            SND_ASYNC = 0x00000001,  // play asynchronously
            SND_FILENAME = 0x00020000,  // name is a file name
            SND_LOOP = 0x00000008,  // loop the sound until next sndPlaySound
            SND_MEMORY = 0x00000004,  // lpszSoundName points to a memory file
            SND_NODEFAULT = 0x00000002,   // silence not default, if sound not found
            SND_NOSTOP = 0x00000010,   // don't stop any currently playing sound
            SND_NOWAIT = 0x00002000,  // don't wait if the driver is busy
            SND_RESOURCE = 0x00040004,  // name is a resource name or atom
            SND_SYNC = 0x00000000   // play synchronously (default)
        }

        static int nMode = 0, g_nWidth, g_nHeight;
        // static int g_nX = 7, g_nY = 27, g_nPreviewWidth = 240, g_nPreviewHeight = 180;
        static bool g_fIsFull = false, g_fIsAuto = true;
        //static string g_strFileType = ".jpg";
        static fileTYPE filetype = fileTYPE.JPG;
        static string strforder = "\\ResidentFlash\\", g_strSoundPath = "";
        //MenuItem g_menuNew = new MenuItem();
        long m_totle = GC.GetTotalMemory(true);
        public enum fileTYPE
        {
            BMP = 1,
            GIF,
            JPG,
            PNG
        };
       public event System.EventHandler ShootEnd;

       public int isOpen;
        public bool AutoAdjust
        {
            get { g_fIsAuto = CIS_GetIsAuto();
                return g_fIsAuto; }
            set { g_fIsAuto = value;
                CIS_SetAuto(value); }
        }
        public bool FullScreen
        {
            get { return g_fIsFull; }
            set { g_fIsFull = value; if (value) { CIS_SetFullScreen(1); } else { CIS_SetFullScreen(0); } }
        }
        public int ImageMode
        {
            get { return nMode; }
            set { nMode = value; GetSize(nMode);
                CIS_SetImageSize((byte)nMode);
            }
        }
        public string Folder
        {
            get { return strforder; }
            set
            {
                strforder = value;
                try
                {
                    RegistryKey key = Registry.LocalMachine.OpenSubKey("Drivers\\BuiltIn\\Camera", true);
                    key.SetValue("Path", strforder);
                    key.Close();
                }
                catch
                {
                }
            }
        }
        public fileTYPE FileType
        {
            get { return filetype; }
            set { filetype = value; }
        }
        public int Gain
        {
            set { if ((!g_fIsAuto) && (value > -4) && (value < 7)) { CIS_SetGainLight(value + 3); } }
        }
        public bool Play
        {
            set
            {
                if (value)
                {
                    CIS_Play();
                    isOpen = 1;
                }
                else
                {
                    CIS_Pause();
                    isOpen = 0;
                }
            }
        }
        public Point LeftTop
        {
            set { CIS_SetPreview(value.X, value.Y, 0, 0); }
        }
        /// <summary>
        /// 播放声音的位置
        /// </summary>
        public static string soundfile
        {
            set { g_strSoundPath = value; }
            get { return g_strSoundPath; }
        }

        public Camera()
        {
            //if (!CIS_InitDevice())
            //{
            //    MessageBox.Show("jj");
            //}
        }
        public bool Open()
        {
            try
            {
                RegistryKey key = Registry.LocalMachine.OpenSubKey("Drivers\\BuiltIn\\Camera");
                string str = (string)key.GetValue("Path");
                if (str != null)
                {
                    strforder = str;
                }
                else
                {
                    try
                    {
                        Directory.CreateDirectory("\\ResidentFlash\\照片");
                    }
                    catch
                    {
                    }
                    strforder = "\\ResidentFlash\\照片\\";
                }
                key.Close();
            }
            catch
            {
                try
                {
                    Directory.CreateDirectory("\\ResidentFlash\\照片");
                }
                catch
                {
                }
                strforder = "\\ResidentFlash\\照片\\";
            }
            try
            {
                RegistryKey keyPath = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Apps\\FFT Camera");
                g_strSoundPath = (string)keyPath.GetValue("InstallDir");
                keyPath.Close();
                if (g_strSoundPath != "")
                {
                    g_strSoundPath += "\\shuttersound.wav";
                }

            }
            catch
            {

            }
            CIS_OpenDevice();
            CIS_SetAuto(true);
            nMode = CIS_GetImageSize();
            nMode = GetSize(nMode);
            CIS_SetImageSize((byte)nMode);

            CIS_UP();
            CIS_SetPreview(7, 33, 228, 171);
            isOpen = 1;
            return false;
        }
        public bool Open(int nX, int nY)
        {
            try
            {
                RegistryKey key = Registry.LocalMachine.OpenSubKey("Drivers\\BuiltIn\\Camera");
                string str = (string)key.GetValue("Path");
                if (str != null)
                {
                    strforder = str;
                }
                else
                {
                    try
                    {
                        Directory.CreateDirectory("\\ResidentFlash\\照片");
                    }
                    catch
                    {
                    }
                    strforder = "\\ResidentFlash\\照片\\";
                }
                key.Close();
            }
            catch
            {
                try
                {
                    Directory.CreateDirectory("\\ResidentFlash\\照片");
                }
                catch
                {
                }
                strforder = "\\ResidentFlash\\照片\\";
            }
            try
            {
                RegistryKey keyPath = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Apps\\FFT Camera");
                g_strSoundPath = (string)keyPath.GetValue("InstallDir");
                keyPath.Close();
                if (g_strSoundPath != "")
                {
                    g_strSoundPath += "\\shuttersound.wav";
                }

            }
            catch
            {

            }
            CIS_OpenDevice();
            CIS_SetAuto(true);
            nMode = CIS_GetImageSize();
            nMode = GetSize(nMode);
            CIS_SetImageSize((byte)nMode);

            CIS_UP();
            CIS_SetPreview(nX, nY, 228, 171);
            isOpen = 1;
            return false;
        }
       public void Pause()
       {
           CIS_Pause();
           isOpen = 0;
       }
        public void Close()
        {
            CIS_DOWN();
            CIS_Pause();
            CIS_CloseDevice();
            isOpen = 0;
        }
        public void Photo()
        {
            Thread th = new Thread(PhotoT);
            th.Start();
        }
        void PhotoT()
        {
            try
            {
                Bitmap bm = new Bitmap(g_nWidth, g_nHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
                BitmapData bmdata = bm.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                CIS_Photograph(bmdata.Scan0);
                SaveFile(bm, filetype);
                bm.Dispose();
                CIS_Pause();
                isOpen = 0;
               // GC.Collect();
            }
            catch (OutOfMemoryException cw)
            {
                CIS_Pause();
                isOpen = 0;
                MessageBox.Show("没有足够内存运行程序\r\n"+cw.Message, "PhotoT");

            }
            catch (Exception cw)
            {
                CIS_Pause();
                MessageBox.Show(cw.Message, "PhotoT");
                //MessageBox.Show("Memory for failure, please expand the program can use memory!");
                CIS_Play();

            }

            PlaySound(g_strSoundPath, 0, playMode.SND_ASYNC | playMode.SND_FILENAME);
            if (this.ShootEnd != null)
                this.ShootEnd(this, null);

        }
        public void Roate()
        {
            CIS_Rotate();
        }
       private string sfilename;
       public string fileName
       {
           get { return sfilename; }
           set { sfilename = value; }
       }
       private string gfilename;
       /// <summary>
       /// 保存时的文件名
       /// </summary>
       public string fileNmae1
       {
           set { gfilename = value; }
           get { return gfilename; }
       }
        private void SaveFile(Bitmap bmpIn, fileTYPE type)
        {
            DateTime dt = DateTime.Now;
            if (!Directory.Exists(strforder))
            {
                Directory.CreateDirectory(strforder);
            }
            try
            {
                string str, rname;
                if (string.IsNullOrEmpty(gfilename) == true)
                {
                    rname = string.Format("0}-{1}-{2}-{3}-{4}-{5}", dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
                }
                else
                    rname = gfilename;
                switch (type)
                {
                    case fileTYPE.BMP:
                        str = string.Format("{1}{0}.bmp", gfilename, strforder);
                        bmpIn.Save(str, ImageFormat.Bmp);
                        break;
                    case fileTYPE.GIF:
                        str = string.Format("{1}{0}.gif", gfilename, strforder);
                        bmpIn.Save(str, ImageFormat.Gif);
                        break;
                    case fileTYPE.JPG:
                        str = string.Format("{1}{0}.jpg", gfilename, strforder);
                        bmpIn.Save(str, ImageFormat.Jpeg);
                        break;
                    case fileTYPE.PNG:
                        str = string.Format("{1}{0}.png", gfilename, strforder);
                        bmpIn.Save(str, ImageFormat.Png);
                        break;
                    default:
                        str = string.Format("{1}{0}.jpg", gfilename, strforder);
                        bmpIn.Save(str, ImageFormat.Jpeg);
                        break;
                }
                sfilename = str;
                //MessageBox.Show(str);
            }
            catch (OutOfMemoryException cw)
            {
                if (cw.InnerException != null)
                    MessageBox.Show("内存溢出错误!\r\n" + cw.InnerException.Message, "SaveFile");
                else
                    MessageBox.Show("内存溢出错误!\r\n" + cw.Message, "SaveFile");
            }
        }
        public  int GetSize(int nMode)
        {
            switch (nMode)
            {
                case 0:
                    g_nWidth = 320;
                    g_nHeight = 240;
                    break;
                case 1:
                    g_nWidth = 640;
                    g_nHeight = 480;
                    break;
                case 2:
                    g_nWidth = 800;
                    g_nHeight = 600;
                    break;
                case 3:
                    g_nWidth = 1024;
                    g_nHeight = 768;
                    break;
                default:
                    g_nWidth = 640;
                    g_nHeight = 480;
                    nMode = 1;
                    break;
            }
            return nMode;
        }

    }
}