光标大小是否可能大于 512x512 像素?
Is a cursor greater than 512x512 pixels in size possible?
目标:
我正在尝试创建一个光标文件,它可以在全高清 (1920x1080) 屏幕上用手电筒效果覆盖整个屏幕。为此,光标图像分辨率需要为 4K (3840x2160) 以及具有 alpha 通道 (32bpp)。 Axialis Cursor Workshop 是我尝试过的唯一一个光标创建程序,它超过了通常的 256² 像素限制,但仍然上限为 512² 像素...
文件格式分析:
查看文件格式规范,256² 像素的通常上限可能是由 CUR/ICO 格式使用 8 位 width
和 height
字段引起的。 ANI 格式看起来更有前途,因为它为那些保留了 32 位。另一方面,它似乎没有热点字段,它本身使用 CUR/ICO 动画帧格式,除非 IconFlag
位设置为 FALSE
。查看 Axialis CW 制作的光标文件,我看到标志设置为 TRUE
很奇怪。
十六进制编辑方法:
我尝试通过十六进制编辑从相同大小 (521²) 的(转换的)bmp 插入光栅数据。然后我尝试从 1024² bpm 插入光栅数据,更新图像尺寸和 headers 中的文件大小。我猜只有 kind of 有效。
如果能提供正确方向的帮助或指点,我将不胜感激。
相关内容,排名不分先后:
- install cursor scheme.inf(从 cur/ani 个文件创建特定的游标方案)
- Set Cursor.ps1(应用特定的游标方案和大小)
- File format specification index(技术细节)
- PNG to BMP Converter(将 png 正确转换为 32bpp bmp 文件)
- Axialis CursorWorkshop(可以在 32bpp 下创建最大 512² 像素的 ani 文件)
使用十六进制编辑器 Neo 和我为 ico/cur 文件格式组合的二进制模板:
// ico.h
#pragma once
#pragma byte_order(LittleEndian)
#include "stddefs.h"
#include "bitmap.h"
struct ICONDIRENTRY;
struct ICONFILE;
public struct ICONDIR {
[description("")]
uint16 Reserved;
$assert(Reserved==0);
[description("Specifies image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image. Other values are invalid.")]
uint16 Type;
[description("Specifies number of images in the file.")]
uint16 Count;
[description("")]
ICONDIRENTRY Entries[Count];
};
struct ICONDIRENTRY {
var entryIndex = array_index;
[description("Cursor Width")]
uint8 Width;
[description("Cursor Height (added height of XORbitmap and ANDbitmap). A negative value would indicate pixel order being top to bottom")]
int8 Height;
[description("Specifies number of colors in the color palette. Should be 0 if the image does not use a color palette.")]
uint8 ColorCount;
[description("")]
uint8 Reserved;
$assert(Reserved==0);
[description("In ICO format: Specifies color planes. Should be 0 or 1. In CUR format: Specifies the horizontal coordinates of the hotspot in number of pixels from the left.")]
uint16 XHotspot;
[description("In ICO format: Specifies bits per pixel. In CUR format: Specifies the vertical coordinates of the hotspot in number of pixels from the top.")]
uint16 YHotspot;
[description("Size of (InfoHeader + ANDBitmap + XORBitmap)")]
uint32 SizeInBytes;
[description("FilePos, where InfoHeader starts")]
uint32 FileOffset as ICONFILE*;
};
struct ICONFILE {
BITMAPINFO Info;
// no idea why this isn't working
/*var bmiv1header = BITMAPINFOHEADER(Info.bmiHeader);
var size = bmiv1header.biSizeImage;
if(size == 0) {
size = Entries[entryIndex].SizeInBytes - bmiv1header.biSize;
}
uint8 RawData[size];*/
uint8 __firstPixel;
};
我成功创建的光标文件看起来像这样应用了模板:
诀窍是将 BITMAPHEADERINFO 结构中的图像高度字段的值设置为高度像素数量的两倍。这样做的原因是预期使用按位 XOR 和 AND 应用两个单独的像素阵列。当它甚至没有添加 AND 像素阵列就已经在预览中工作时,我感到很惊讶。好像你可以省略那个什么的,idk。
目标:
我正在尝试创建一个光标文件,它可以在全高清 (1920x1080) 屏幕上用手电筒效果覆盖整个屏幕。为此,光标图像分辨率需要为 4K (3840x2160) 以及具有 alpha 通道 (32bpp)。 Axialis Cursor Workshop 是我尝试过的唯一一个光标创建程序,它超过了通常的 256² 像素限制,但仍然上限为 512² 像素...
文件格式分析:
查看文件格式规范,256² 像素的通常上限可能是由 CUR/ICO 格式使用 8 位 width
和 height
字段引起的。 ANI 格式看起来更有前途,因为它为那些保留了 32 位。另一方面,它似乎没有热点字段,它本身使用 CUR/ICO 动画帧格式,除非 IconFlag
位设置为 FALSE
。查看 Axialis CW 制作的光标文件,我看到标志设置为 TRUE
很奇怪。
十六进制编辑方法:
我尝试通过十六进制编辑从相同大小 (521²) 的(转换的)bmp 插入光栅数据。然后我尝试从 1024² bpm 插入光栅数据,更新图像尺寸和 headers 中的文件大小。我猜只有 kind of 有效。
如果能提供正确方向的帮助或指点,我将不胜感激。
相关内容,排名不分先后:
- install cursor scheme.inf(从 cur/ani 个文件创建特定的游标方案)
- Set Cursor.ps1(应用特定的游标方案和大小)
- File format specification index(技术细节)
- PNG to BMP Converter(将 png 正确转换为 32bpp bmp 文件)
- Axialis CursorWorkshop(可以在 32bpp 下创建最大 512² 像素的 ani 文件)
使用十六进制编辑器 Neo 和我为 ico/cur 文件格式组合的二进制模板:
// ico.h
#pragma once
#pragma byte_order(LittleEndian)
#include "stddefs.h"
#include "bitmap.h"
struct ICONDIRENTRY;
struct ICONFILE;
public struct ICONDIR {
[description("")]
uint16 Reserved;
$assert(Reserved==0);
[description("Specifies image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image. Other values are invalid.")]
uint16 Type;
[description("Specifies number of images in the file.")]
uint16 Count;
[description("")]
ICONDIRENTRY Entries[Count];
};
struct ICONDIRENTRY {
var entryIndex = array_index;
[description("Cursor Width")]
uint8 Width;
[description("Cursor Height (added height of XORbitmap and ANDbitmap). A negative value would indicate pixel order being top to bottom")]
int8 Height;
[description("Specifies number of colors in the color palette. Should be 0 if the image does not use a color palette.")]
uint8 ColorCount;
[description("")]
uint8 Reserved;
$assert(Reserved==0);
[description("In ICO format: Specifies color planes. Should be 0 or 1. In CUR format: Specifies the horizontal coordinates of the hotspot in number of pixels from the left.")]
uint16 XHotspot;
[description("In ICO format: Specifies bits per pixel. In CUR format: Specifies the vertical coordinates of the hotspot in number of pixels from the top.")]
uint16 YHotspot;
[description("Size of (InfoHeader + ANDBitmap + XORBitmap)")]
uint32 SizeInBytes;
[description("FilePos, where InfoHeader starts")]
uint32 FileOffset as ICONFILE*;
};
struct ICONFILE {
BITMAPINFO Info;
// no idea why this isn't working
/*var bmiv1header = BITMAPINFOHEADER(Info.bmiHeader);
var size = bmiv1header.biSizeImage;
if(size == 0) {
size = Entries[entryIndex].SizeInBytes - bmiv1header.biSize;
}
uint8 RawData[size];*/
uint8 __firstPixel;
};
我成功创建的光标文件看起来像这样应用了模板:
诀窍是将 BITMAPHEADERINFO 结构中的图像高度字段的值设置为高度像素数量的两倍。这样做的原因是预期使用按位 XOR 和 AND 应用两个单独的像素阵列。当它甚至没有添加 AND 像素阵列就已经在预览中工作时,我感到很惊讶。好像你可以省略那个什么的,idk。