我想在图上叠加点东西VB是下面这样写的 
好像是通过指针取出来,画点东西,再放回去
不懂c# 怎么写  麻烦指点一下
'ABitmap位图结构体的指针,picHook是个pictureBox
Dim bmp As BITMAP
Dim pts As Long    CopyMemory VarPtr(bmp), ABitmap, Len(bmp)
    With picHook
        .Cls
        .Width = bmp.bmWidth
        .Height = bmp.bmHeight
         .Image , bmp.bmWidthBytes * bmp.bmHeight, ByVal bmp.bmBits
        .PaintPicture Me.Icon, 10, 10
        .CurrentX = 20
        .CurrentY = 20
        picHook.Print "Time Stamp: " & Format(LongLongToDouble(APTSLow, APTSHigh), "0.000000")
        GetBitmapBits .Image, bmp.bmWidthBytes * bmp.bmHeight, ByVal bmp.bmBits
    End With

解决方案 »

  1.   

    C#可以用指针 操作BitmapData 
    or
    Bitmap GetPixel SetPixel
      

  2.   

    C#在图上画东西可以用GDI+的Bitmap source=new Bitmap("图片路径");
    Graphics surface=Graphics.FromImage(source);
    surface.DrawString("Time Stamp:.....",new Font("宋体",12f),Brushs.Red,new PointF(20,20));
    source.Save("新图路径");
    surface.Dispose();
    source.Dispose();
      

  3.   

    C#不需要这么麻烦,直接从Bitmap上获取Graphic,然后绘制你要的东西,再转换成新的Bitmap即可。
      

  4.   

    你要对图片操作可以直接使用GDI啊,通过图片获得Graphic 然后通过Graphic的 方法来绘制你想要的东西啊,具体参考下:
    http://www.cnblogs.com/zhili/archive/2013/05/24/3096101.html
      

  5.   

    Bitmap source=new Bitmap("图片路径");  这样加载图片文件的我百度到了 但不是这样
    --------------------------------
    图片是别的控件生成的   它传来了一个位图结构体的指针  而我要修改这个位图
    现在只有指针  我是想问怎么样去获取到这个位图对象 
    得到这个对象我才好修改它
      

  6.   

    可以转换成句柄 再 Graphics.FromIntPtr(); 也可以在上面绘图的
      

  7.   

    楼主试试//e.g. int:1000
    IntPtr ptr = (IntPtr)1000;
    //is null?
    Bitmap bitmap = Image.FromHbitmap(ptr);
    Graphics dc = Graphics.FromImage(bitmap);
    //
    //draw something
    //
    bitmap.Save("path");
      

  8.   

    System.Drawing.Image.FromStream  找不到  FromIntPtr啊
    ---------
    Bitmap bitmap = Image.FromHbitmap(ptr);
    这个失败了  在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常郁闷咯...
      

  9.   

    看来你那个int未必是位图句柄啊~~
      

  10.   

    用这个类转换试下:
    http://www.emoticode.net/c-sharp/convert-a-dib-to-a-system-drawing-bitmap.html
    (拷贝到105行 Another approach.... 就可以了)
    调用方法:
    Bitmap xxx = DibToBitmap.Convert(ptr);
      

  11.   

    谢谢
    ----------
    int位图句柄 控件作者说的 
    -------------http://www.emoticode.net/c-sharp/convert-a-dib-to-a-system-drawing-bitmap.html
    这个怎么一直打不开呢
      

  12.   


    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;public class DibToBitmap
    {
    /// <summary>
    /// Convert DIB to Bitmap.
    /// </summary>
    /// <param name="dibPtrArg">Pointer to memory DIB, starting with BITMAPINFOHEADER.</param>
    /// <returns>A Bitmap</returns>
    public static Bitmap Convert(IntPtr dibPtrArg)
    {
    BITMAPINFOHEADER bmi;
    IntPtr pixptr; GetPixelInfo(dibPtrArg, out pixptr, out bmi); Bitmap bitMap = new Bitmap(bmi.biWidth, bmi.biHeight); Graphics scannedImageGraphics = Graphics.FromImage(bitMap); IntPtr hdc = scannedImageGraphics.GetHdc(); SetDIBitsToDevice(
       hdc,
       0,             // XDest
       0,             // YDest
       bmi.biWidth,
       bmi.biHeight,
       0,             // XSrc
       0,             // YSrc
       0,             // uStartScan
       bmi.biHeight,  // cScanLines
       pixptr,        // lpvBits
       dibPtrArg,     // lpbmi
       0);            // 0 = literal RGB values rather than palette scannedImageGraphics.ReleaseHdc(hdc); const float inchPerMeter = 39.3700787F;
    bitMap.SetResolution(bmi.biXPelsPerMeter / inchPerMeter, bmi.biYPelsPerMeter / inchPerMeter); // bitMap.Save(@"c:\0\2.bmp", ImageFormat.Bmp); // debug code return bitMap;
    }
    static private void GetPixelInfo(IntPtr bmpptr, out IntPtr pix, out BITMAPINFOHEADER bmi)
    { bmi = new BITMAPINFOHEADER();
    Marshal.PtrToStructure(bmpptr, bmi); // copy into struct. 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;
    } pix = (IntPtr)((p * 4) + bmi.biSize + (int)bmpptr); } [StructLayout(LayoutKind.Sequential, Pack = 2)]
    private class BITMAPINFOHEADER
    {
    public int biSize;
    public int biWidth;
    public int biHeight;
    public short biPlanes;
    public short biBitCount;
    public int biCompression;
    public int biSizeImage;
    public int biXPelsPerMeter;
    public int biYPelsPerMeter;
    public int biClrUsed;
    public int biClrImportant;
    } [DllImport("gdi32.dll", ExactSpelling = true)]
    internal static extern int SetDIBitsToDevice(
       IntPtr hdc,
       int xdst,
       int ydst,
       int width,
       int height,
       int xsrc,
       int ysrc,
       int start,
       int lines,
       IntPtr bitsptr,
       IntPtr bmiptr,
       int color);} // class DibToImage
      

  13.   

    感谢楼上楼上的方法可以取到图片的信息
    (怎么最后一项是负数,不知有没有错)但保存到图片bitMap.Save(@"c:\2.bmp");居然没有图像的  郁闷----------------------------------
    或者我应该这么问  
    如何把指针数据转成数据流stream
    图片可支持数据流读取http://zhidao.baidu.com/link?url=qOCXD8fDcUueIloZIh6n9vhPvScPsJNzO8HwKxOiKuCRk581TQfGDTRUfSeQ-OrSoP7p18rOBEngexjBB4Bd4a
      

  14.   

    这个数据是不对的,可能你得到也不是DIB。
    用下面这段程序把收到的数据打出来,把结果贴出来看看是什么:var data = new byte[60];
    Marshal.Copy(ptr, data, 0, 60);
    Console.WriteLine(BitConverter.ToString(data));
      

  15.   

    得出是这一串00-00-00-00-A4-02-00-00-AE-01-00-00-90-0A-00-00-01-00-20-00-40-00-3E-09-00-00-00-40-00-3E-09-E0-BD-11-00-40-00-3E-09-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00看不懂
      

  16.   

    你得到的是一个DDB,用下面这个类转下再试试: public class DdbToBitmap
    {
    public static Bitmap Convert(IntPtr ptr)
    {
    var hBmp = CreateBitmapIndirect(ptr);
    var bmp = Bitmap.FromHbitmap(hBmp);
    DeleteObject(hBmp);
    return bmp;
    }
    [DllImport("gdi32.dll")]
    static extern private IntPtr CreateBitmapIndirect(IntPtr lpbm);
    [DllImport("gdi32.dll")]
    private static extern bool DeleteObject(IntPtr hObject);
    }
      

  17.   

    终于取到图片了 原来得先用  CreateBitmapIndirect
    困扰几天了…………
    感谢jshi123!!!!!!!!!!!!!!!!!!
    也感谢hwenycocodq520、devmiao、lizhi3186575、sheryee1、zhoujk等几位热心人!-----------------------
    再次请教一下  位图修改后如何放回内存原来的位置呢 
    我的目的是修改内存那个图片我用了SetBitmapBits 好像不成功  不知是不是我没用对
      

  18.   

    zhoujk说的是这个不:"C# 对图像进行高速读写" 提供对Image<=>Array 的高速读写积分暂时不够,还没下到
    能否直接修改内存里的图片呢
      

  19.   

    zhoujk好像对图像很有研究  应该行
      

  20.   

    用下面这个保存回去试下:public class DdbUtility
    {
    public static void SaveBitmapToDdb(Bitmap bmp, IntPtr ptr)
    {
    var hBmp = bmp.GetHbitmap(); var bitmap = new BITMAP();
    GetObject(hBmp, Marshal.SizeOf(bitmap), ref bitmap); int dwBmpSize = ((bmp.Width * bitmap.bmBitsPixel + 31) / 32) * 4 * bmp.Height; var pDest = Marshal.ReadIntPtr(ptr, 20);
    CopyMemory(pDest, bitmap.bmBits, (uint)dwBmpSize); DeleteObject(hBmp);
    } [StructLayout(LayoutKind.Sequential)]
    public struct BITMAP
    {
    public int bmType;
    public int bmWidth;
    public int bmHeight;
    public int bmWidthBytes;
    public ushort bmPlanes;
    public ushort bmBitsPixel;
    public IntPtr bmBits;
    }; [DllImport("gdi32.dll")]
    public static extern int GetObject(IntPtr hObject, int cbBuffer, ref BITMAP lpObject); [DllImport("kernel32.dll")]
    public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); [DllImport("gdi32.dll")]
    private static extern bool DeleteObject(IntPtr hObject);
    }
      

  21.   

    终于搞定了 感谢jshi123!!!唯一不足的是  保存回去后  图像旋转了180度
    我看不出哪里出的问题 
    只能在picturebox.RotateFlip旋转后再保存回去 不知jshi123能否简单修改就达到效果
    不行的话我就这么用了 再次感谢各位热心人!
      

  22.   

    好像BITMAP的第一扫描线就是最下面的(从下到上),就是Bitmap.FromHbitmap的时候已经反过来了。
    就用RotateFlip反一下吧,最方便了。
      

  23.   

    [email protected] m  谢了