如何根据IntPtr直接转换成.net里的System.Drawing.Image对象?

昵称这是个问题 2018-01-28 09:25:14
我用扫描仪,采用Twain协议方式,扫描后获取了一个IntPtr,如何把它转换为Image呢?求解,谢谢!
...全文
1577 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
全栈极简 2018-01-29
  • 打赏
  • 举报
回复
我记得codeproject上面有完整的可应用的程序的,可以找找看。
全栈极简 2018-01-29
  • 打赏
  • 举报
回复
   IntPtr bmpptr = GlobalLock(img);
                            IntPtr pixptr = GetPixelInfo(bmpptr);
                            Bitmap bitmap = BitmapFromDIB(bmpptr, pixptr);
 [DllImport("kernel32.dll", ExactSpelling = true)]
        internal static extern IntPtr GlobalLock(IntPtr handle);
/// <summary>
        /// 获得内存图片像素信息
        /// </summary>
        /// <param name="bmpptr">内存图片指针</param>
        /// <returns></returns>
        protected IntPtr GetPixelInfo(IntPtr bmpptr)
        {
            BITMAPINFOHEADER bmi = new BITMAPINFOHEADER();
            Marshal.PtrToStructure(bmpptr, bmi);
            Rectangle bmprect = new Rectangle(0, 0, 0, 0); ;
            bmprect.X = bmprect.Y = 0;
            bmprect.Width = bmi.biWidth;
            bmprect.Height = bmi.biHeight;

            if (bmi.biSizeImage == 0)
                bmi.biSizeImage = ((((bmi.biWidth * bmi.biBitCount) + 31) & ~31) >> 3) * bmi.biHeight;

            int p = bmi.biClrUsed;
            if ((p == 0) && (bmi.biBitCount <= 8))
                p = 1 << bmi.biBitCount;
            p = (p * 4) + bmi.biSize + (int)bmpptr;
            return (IntPtr)p;
        }
/// <summary>
        /// 从DIB获得图片指针
        /// </summary>
        /// <param name="pDIB"></param>
        /// <param name="pPix"></param>
        /// <returns></returns>
        public static Bitmap BitmapFromDIB(IntPtr pDIB, IntPtr pPix)
        {
            MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus",
                            BindingFlags.Static | BindingFlags.NonPublic);

            if (mi == null)
                return null; // (permission problem) 

            IntPtr pBmp = IntPtr.Zero;
            int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, out pBmp);

            if ((status == 0) && (pBmp != IntPtr.Zero)) // success 
                return (Bitmap)mi.Invoke(null, new object[] { pBmp });
            else
                return null; // failure 
        }
基于C#的典型图像处理算法 第二章: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; //using System.Drawing.Drawing2D; namespace gray { public partial class Form1 : Form { public Form1() { InitializeComponent(); myTimer = new HiPerfTimer(); } private void open_Click(object sender, EventArgs e) { OpenFileDialog opnDlg = new OpenFileDialog(); opnDlg.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;"+ "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" + "位图( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" + "矢量图( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf"; opnDlg.Title = "打开图像文件"; opnDlg.ShowHelp = true; if (opnDlg.ShowDialog() == DialogResult.OK) { curFileName = opnDlg.FileName; try { curBitmap = (Bitmap)Image.FromFile(curFileName); } catch (Exception exp) { MessageBox.Show(exp.Message); } } Invalidate(); } private void save_Click(object sender, EventArgs e) { if(curBitmap == null) { return; } SaveFileDialog saveDlg = new SaveFileDialog(); saveDlg.Title = "保存为"; saveDlg.OverwritePrompt = true; saveDlg.Filter = "BMP文件 (*.bmp) | *.bmp|" + "Gif文件 (*.gif) | *.gif|" + "JPEG文件 (*.jpg) | *.jpg|" + "PNG文件 (*.png) | *.png"; saveDlg.ShowHelp = true; if(saveDlg.ShowDialog() == DialogResult.OK) { string fileName = sav

62,244

社区成员

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

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

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

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