光标大小是否可能大于 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 位 widthheight 字段引起的。 ANI 格式看起来更有前途,因为它为那些保留了 32 位。另一方面,它似乎没有热点字段,它本身使用 CUR/ICO 动画帧格式,除非 IconFlag 位设置为 FALSE。查看 Axialis CW 制作的光标文件,我看到标志设置为 TRUE 很奇怪。

十六进制编辑方法:
我尝试通过十六进制编辑从相同大小 (521²) 的(转换的)bmp 插入光栅数据。然后我尝试从 1024² bpm 插入光栅数据,更新图像尺寸和 headers 中的文件大小。我猜只有 kind of 有效。

如果能提供正确方向的帮助或指点,我将不胜感激。


相关内容,排名不分先后:

使用十六进制编辑器 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。