Kitty 图形协议仅在 kitty 中不起作用

Kitty graphics protocol not working in kitty only

我有一个 c 程序,它应该使用 Kitty graphics protocol and utilizing ImageMagick 7.

将图像打印到终端

我用我的代码创建了这个最小的例子。请注意,为简单起见,缺少错误检查和内存释放:

#include <stdint.h>
#include <stdio.h>

#include <MagickCore/MagickCore.h>

int main()
{
    ExceptionInfo* exceptionInfo = AcquireExceptionInfo();
    
    ImageInfo* imageInfoIn = AcquireImageInfo();
    CopyMagickString(imageInfoIn->filename, "./image.jpg", 12);

    Image* image = ReadImage(imageInfoIn, exceptionInfo);
    
    ImageInfo* imageInfoOut = AcquireImageInfo();
    CopyMagickString(imageInfoOut->magick, "RGBA", 5);

    size_t length;
    void* blob = ImageToBlob(imageInfoOut, image, &length, exceptionInfo);
    blob = Base64Encode(blob, length, &length);

    printf("3_Ga=T,f=32,s=%u,v=%u;", image->columns, image->rows);
    fwrite(blob, sizeof(char), length, stdout);
    puts("3\");

    return 0;
}

此代码在 Konsole、WezTerm 和 Wayst(显示图像)中运行良好,但在 kitty 本身中它只是将 RGBA 数据的 base64 编码打印为文本。

kitty +kitten icat path/to/some/image.png 工作正常,所以终端支持正在工作。

我还缺少什么让它在 kitty 中也能正常工作?

问题是,kitty 一次只允许发送 4096 字节的图像数据。所以你需要把它分成多个转义码才能使用。

上面修改后的程序也可以在 kitty 中运行,如下所示:

#include <stdint.h>
#include <stdio.h>

#include <MagickCore/MagickCore.h>

static void printChunc(void** blob, size_t* length, uint32_t chunkSize)
{
    size_t toWrite = chunkSize < *length ? chunkSize : *length;
    printf("3_Gm=%i;", toWrite == chunkSize ? 1 : 0); 
    fwrite(*blob, sizeof(char), toWrite, stdout);
    fputs("3\", stdout);
    *blob = ((char*) *blob) + toWrite;
    *length -= toWrite;
}

int main()
{
    ExceptionInfo* exceptionInfo = AcquireExceptionInfo();
    
    ImageInfo* imageInfoIn = AcquireImageInfo();
    CopyMagickString(imageInfoIn->filename, "./image.jpg", 12);

    Image* image = ReadImage(imageInfoIn, exceptionInfo);
    
    ImageInfo* imageInfoOut = AcquireImageInfo();
    CopyMagickString(imageInfoOut->magick, "RGBA", 5);

    size_t length;
    void* blob = ImageToBlob(imageInfoOut, image, &length, exceptionInfo);
    blob = Base64Encode(blob, length, &length);

    printf("3_Ga=T,f=32,s=%u,v=%u,m=1;3\", image->columns, image->rows);
    while(length > 0)
        printChunc(&blob, &length, 4096);
    putchar('\n');

    return 0;
}

注意 m= 键,告诉 kitty 是否还有更多数据。

感谢 Reddit 上的 u/aumerlex 帮助解决这个问题。