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 帮助解决这个问题。
我有一个 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 帮助解决这个问题。