我想在图上叠加点东西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
好像是通过指针取出来,画点东西,再放回去
不懂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
or
Bitmap GetPixel SetPixel
Graphics surface=Graphics.FromImage(source);
surface.DrawString("Time Stamp:.....",new Font("宋体",12f),Brushs.Red,new PointF(20,20));
source.Save("新图路径");
surface.Dispose();
source.Dispose();
http://www.cnblogs.com/zhili/archive/2013/05/24/3096101.html
--------------------------------
图片是别的控件生成的 它传来了一个位图结构体的指针 而我要修改这个位图
现在只有指针 我是想问怎么样去获取到这个位图对象
得到这个对象我才好修改它
IntPtr ptr = (IntPtr)1000;
//is null?
Bitmap bitmap = Image.FromHbitmap(ptr);
Graphics dc = Graphics.FromImage(bitmap);
//
//draw something
//
bitmap.Save("path");
---------
Bitmap bitmap = Image.FromHbitmap(ptr);
这个失败了 在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常郁闷咯...
http://www.emoticode.net/c-sharp/convert-a-dib-to-a-system-drawing-bitmap.html
(拷贝到105行 Another approach.... 就可以了)
调用方法:
Bitmap xxx = DibToBitmap.Convert(ptr);
----------
int位图句柄 控件作者说的
-------------http://www.emoticode.net/c-sharp/convert-a-dib-to-a-system-drawing-bitmap.html
这个怎么一直打不开呢
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
(怎么最后一项是负数,不知有没有错)但保存到图片bitMap.Save(@"c:\2.bmp");居然没有图像的 郁闷----------------------------------
或者我应该这么问
如何把指针数据转成数据流stream
图片可支持数据流读取http://zhidao.baidu.com/link?url=qOCXD8fDcUueIloZIh6n9vhPvScPsJNzO8HwKxOiKuCRk581TQfGDTRUfSeQ-OrSoP7p18rOBEngexjBB4Bd4a
用下面这段程序把收到的数据打出来,把结果贴出来看看是什么:var data = new byte[60];
Marshal.Copy(ptr, data, 0, 60);
Console.WriteLine(BitConverter.ToString(data));
{
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);
}
困扰几天了…………
感谢jshi123!!!!!!!!!!!!!!!!!!
也感谢hwenycocodq520、devmiao、lizhi3186575、sheryee1、zhoujk等几位热心人!-----------------------
再次请教一下 位图修改后如何放回内存原来的位置呢
我的目的是修改内存那个图片我用了SetBitmapBits 好像不成功 不知是不是我没用对
能否直接修改内存里的图片呢
{
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);
}
我看不出哪里出的问题
只能在picturebox.RotateFlip旋转后再保存回去 不知jshi123能否简单修改就达到效果
不行的话我就这么用了 再次感谢各位热心人!
就用RotateFlip反一下吧,最方便了。