Создайте полупрозрачный курсор из изображения - PullRequest
9 голосов
/ 05 февраля 2009

Можно ли создать курсор из изображения и сделать его полупрозрачным?

В настоящее время я беру собственное изображение и накладываю поверх него изображение курсора мыши. Было бы здорово, если бы я мог сделать это полупрозрачным, но не обязательно. Продавцы любят блестящие.

В настоящее время делаем что-то вроде этого:

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());

альтернативный текст http://members.cox.net/dustinbrooks/drag.jpg

Ответы [ 4 ]

6 голосов
/ 11 сентября 2009

Я попробовал следующий пример, и он работал нормально ...

    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);

И изображение Up.png сохраняется с непрозрачностью 75% в AdobePhotoshop.

0 голосов
/ 09 августа 2016

Если вы хотите установить прозрачность растрового изображения пользовательского курсора мыши «на лету», вам может пригодиться эта функция. Он использует цветовую матрицу, чтобы установить степень прозрачности для любого заданного растрового изображения и вернет измененный. Чтобы иметь прозрачность 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;

}

0 голосов
/ 21 сентября 2012

это очень просто, я не использую 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.

Я надеюсь, что это ваше решение

0 голосов
/ 05 сентября 2009

На макушке головы (сначала попробую):

  1. создать новое растровое изображение того же размера, что и оригинал, но со структурой ARGB
  2. drawimage: существующее растровое изображение к новому растровому изображению
  3. доступ к необработанным растровым данным и замена байтов A на 128

У вас должно быть хорошее полупрозрачное растровое изображение.

Если производительность позволяет, вы можете отсканировать полностью прозрачные пиксели и установить для них значение ноль!

...