从图像创建半透明光标

时间:2009-02-05 15:54:28

标签: c# winforms cursor transparency

是否可以从图像创建光标并使其半透明?

我目前正在拍摄自定义图像,并且正在处理鼠标光标图像。如果我可以使这个半透明,但不是必要的,那将是很好的。销售人员喜欢闪亮。

目前正在做这样的事情:

Image cursorImage = customImage.GetThumbnailImage(300, 100, null, IntPtr.Zero);
cursorImage.SetResolution(96.0F, 96.0F);
int midPointX = cursorImage.Width / 2;
int midPointY = cursorImage.Height / 2;
Bitmap cursorMouse = GetCursorImage(cursorOverlay);
Graphics cursorGfx = Graphics.FromImage(cursorImageCopy);
cursorGfx.DrawImageUnscaled(cursorMouse, midPointX, midPointY);

Cursor tmp = new Cursor(cursorImage.GetHicon());

alt text http://members.cox.net/dustinbrooks/drag.jpg

4 个答案:

答案 0 :(得分:6)

我尝试过以下示例,它工作正常......

    public struct IconInfo
    {
        public bool fIcon;
        public int xHotspot;
        public int yHotspot;
        public IntPtr hbmMask;
        public IntPtr hbmColor;
    }


    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);

    [DllImport("user32.dll")]
    public static extern IntPtr CreateIconIndirect(ref IconInfo icon);

    public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
    {
        IntPtr ptr = bmp.GetHicon();
        IconInfo tmp = new IconInfo();
        GetIconInfo(ptr, ref tmp);
        tmp.xHotspot = xHotSpot;
        tmp.yHotspot = yHotSpot;
        tmp.fIcon = false;
        ptr = CreateIconIndirect(ref tmp);
        return new Cursor(ptr);
    }

我把它放在按钮点击事件上(你可以从你喜欢的地方打电话):

Bitmap b = new Bitmap("D:/Up.png");
this.Cursor = CreateCursor(b, 5, 5);

在AdobePhotoshop中,Up.png图像以75%的不透明度保存。

答案 1 :(得分:0)

在我的头顶(我会先试试):

  1. 创建与原始大小相同但具有ARGB结构的新位图
  2. drawimage:现有位图到新位图
  3. 访问原始位图数据,并用128
  4. 替换A字节

    你应该有漂亮的半透明位图。

    如果性能允许,您可以扫描完全透明的像素并将A设置为零!

答案 2 :(得分:0)

如果要“动态”设置自定义鼠标光标位图的透明度,您可能会发现此功能很有用。它使用颜色矩阵来设置任何给定位图的透明度,并返回修改后的位图。为了获得透明度, TranspFactor 应介于225和245之间,只需尝试一下即可。 (您需要导入System.Drawing和System.Drawing.Imaging)

public static Bitmap GetBMPTransparent(Bitmap bmp, int TranspFactor)

{

Bitmap transpBmp = new Bitmap(bmp.Width, bmp.Height);
using (ImageAttributes attr = new ImageAttributes()) {
    ColorMatrix matrix = new ColorMatrix { Matrix33 = Convert.ToSingle(TranspFactor / 255) };
    attr.SetColorMatrix(matrix);
    using (Graphics g = Graphics.FromImage(transpBmp)) {
        g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr);
    }
}
return transpBmp;

}

答案 3 :(得分:-2)

这很容易,我不使用API​​。

代码是

  Bitmap img = new Bitmap(new Bitmap(@"image.png"), 30, 30); //this is the size of cursor

  Icon icono = Icon.FromHandle(img.GetHicon()); //create the Icon object 

  Cursor = new Cursor(icono.Handle); //the icon Object has the stream to create a Cursor.

我希望这是你的解决方案