Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Не могу вставить картинку .cur в PictureBox

Добрейшего,

Я делаю программу, которая должна отобразить все курсоры в PictureBox'ы

Где хранятся курсоры
СкопированоHKEY_CURRENT_USER\Control Panel\Cursors

Но проблема, PictureBox пишет  "Скопировано.cur не является допустимым типом ресурса"

Ещё я попробовал через конвертер .cur в .png, получилось, но чтобы программа нормально работала, надо сделать конвертер в c#
У меня не получилось, то пишет недостаточно памяти, то параметр указан не верно

Два способа

using (Image image1 = Image.FromFile(@"C:\Users\ВМП-Уфа\Desktop\Arrow.cur", true))
    image1.Save(@"C:\Users\ВМП-Уфа\Desktop\Arrow.png" style="color: #25d39d !important", ImageFormat.Png);

Image bmp = new Bitmap(@"C:\Users\ВМП-Уфа\Desktop\Arrow.cur");
bmp.Save(@"C:\Users\ВМП-Уфа\Desktop\Arrow.png" style="color: #25d39d !important", ImageFormat.Png);

 

 

Кто знает как сделать конвертер или как запихнуть .cur в pictureBox?   

Добрый день.
Может поможет - https://stackoverflow.com/a/18398380

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь

Офигеть спасибо оооогромное!!! Я целый день гуглил на разных языках, не нашёл и тут вы как БОГ с небес

КОД, если кому-то лень искать в ссылке

Icon i = Icon.ExtractAssociatedIcon(@"C:\Users\ВМП-Уфа\Desktop\Arrow.cur");
            pictureBox.BackgroundImage = i.ToBitmap();

// Преобразовал и отобразил в pictureBox

 

Ну не знаю, может у вас неправильный 🙂
Я это сам нагуглил секунд за 30...

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь

🖐 Приветствую. Вставлю свои три копейки. Возможно, стоит обратить внимание на тот факт, что метод Icon.ExtractAssociatedIcon()возвращает размер 32x32 или 16x16. Точно не помню. Так что я от него ранее отказался в контексте моих задач. Удачи в начинаниях.

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь
Цитата: Viktor от 06.08.2022, 09:08

🖐 Приветствую. Вставлю свои три копейки. Возможно, стоит обратить внимание на тот факт, что метод

Icon.ExtractAssociatedIcon()

Icon.ExtractAssociatedIcon()возвращает размер 32x32 или 16x16. Точно не помню. Так что я от него ранее отказался в контексте моих задач. Удачи в начинаниях.

Приветствую. Ну тут речь о курсорах. Вероятно этого разрешения будет достаточно (не знаю какое стандартное разрешение у курсоров). Да и я особо не вникал, в гугле полно инвы на данную тему, дал линк на первый попавшийся ответ.

Приветствую. Ну тут речь о курсорах. Вероятно этого разрешения будет достаточно (не знаю какое стандартное разрешение у курсоров). Да и я особо не вникал, в гугле полно инвы на данную тему, дал линк на первый попавшийся ответ.

🙂 Я хотел обратить внимание автора темы в контексте его задачи. Сам я не сразу заметил этот нюанс. 

Немного оффтопа
Мне попаля код в гите, который компонует иконку. Везде формате .ico(части Directory) первые 2byte это ширина и высота.  Я решил проверить, а что произойдет если в методе указать больше размеры. Взял 2048x2048, и оно собралось без проблем.  Не пойму как получается болше размер, если диапазон 1 byte.

public static bool ConvertToIcon(Bitmap inputBitmap, Stream output)
 {
     if (inputBitmap is null) return false;

     int[] sizes = new int[] { 512, 256, 96, 80, 72, 64, 60, 48, 40, 36, 32, 30, 24, 16 };

     // Generate bitmaps for all the sizes and toss them in streams
     List<MemoryStream> imageStreams = new List<MemoryStream>();
     foreach (int size in sizes)
     {
         Bitmap newBitmap = ResizeImage(inputBitmap, size, size);
         if (newBitmap is null) return false;
         MemoryStream memoryStream = new MemoryStream();
         newBitmap.Save(memoryStream, ImageFormat.Png);
         imageStreams.Add(memoryStream);
     }

     BinaryWriter iconWriter = new BinaryWriter(output);
     if (output is null || iconWriter is null) return false;

     int offset = 0;

     // 0-1 reserved, 
     iconWriter.Write((short)0);

     // 2-3 image type, 1 = icon, 2 = cursor
     iconWriter.Write((short)1);

     // 4-5 number of images
     iconWriter.Write((short)sizes.Length);

     offset += 6 + (16 * sizes.Length);

     for (int i = 0; i < sizes.Length; i++)
     {
         // image entry 1
         // 0 image width
         iconWriter.Write((byte)sizes[i]);
         // 1 image height
         iconWriter.Write((byte)sizes[i]);

         // 2 number of colors
         iconWriter.Write((byte)0);

         // 3 reserved
         iconWriter.Write((byte)0);

         // 4-5 color planes
         iconWriter.Write((short)0);

         // 6-7 bits per pixel
         iconWriter.Write((short)32);

         // 8-11 size of image data
         iconWriter.Write((int)imageStreams[i].Length);

         // 12-15 offset of image data
         iconWriter.Write((int)offset);

         offset += (int)imageStreams[i].Length;
     }

     for (int i = 0; i < sizes.Length; i++)
     {
         // write image data
         // png data must contain the whole png data file
         iconWriter.Write(imageStreams[i].ToArray());
         imageStreams[i].Close();
     }

     iconWriter.Flush();

     return true;
 }

P.S Не знаю как добавить спойлер в спойлер. 😐

Я когда делал FastToIcon тоже по куче граблей прошелся, т.к. в C# стандартные средства работы с иконками кривые как не знаю что, много что пришлось на WinAPI переделать дергая нужные функции из DLL.

Цитата: Adler от 06.08.2022, 10:19

Я когда делал FastToIcon тоже по куче граблей прошелся, т.к. в C# стандартные средства работы с иконками кривые как не знаю что, много что пришлось на WinAPI переделать дергая нужные функции из DLL.

Я пользовался FastToIcon . Я сейчас платформой в своем приложении занимаюсь. Не успел ещё внедрить исходный код класса . Он в лучшем виде изображение до нужного размера сжимает, помещает все размеры которые тебе нужны в Icon. Возможно тебе такое будет интересно ❓

 

Как бы его я и не использовал. По крайней мере на вскидку очень похоже. Доберусь до исходников посмотрю.