Как указать байтовый порядок в Jasper JPEG2000
Я кодирую необработанный байт в JPEG2000 с использованием библиотеки Джаспера. Полученное изображение с прямым порядком байтов, тогда как мне нужен вывод с прямым порядком байтов. Как указать порядок байтов в яшме? Вот фрагмент кода:
EncodeAsJPEG2000(array<Byte> ^inputImage, array<Byte> ^outputImage, uint32 width, uint32 height, uint32 size)
{
jas_init();
jas_image_t *pImage;
pImage = jas_image_create0();
pin_ptr<Byte> pInput = &inputImage[0];
int totalCopied = 0;
if (pImage)
{
tsize_t bytesperline = 2;
int iCmp = 0;
jas_stream_t *pStream;
jas_image_cmptparm_t cmptparm;
cmptparm.tlx = 0;
cmptparm.tly = 0;
cmptparm.hstep = 1;
cmptparm.vstep = 1;
cmptparm.width = width;
cmptparm.height = height;
cmptparm.prec = 16;
cmptparm.sgnd = false;
jas_image_addcmpt(pImage, iCmp, &cmptparm);
//jas_image_setcmpttype(pImage, 0, JAS_IMAGE_CT_GRAY_Y);
pImage->clrspc_ = JAS_CLRSPC_SGRAY; /* grayscale Image */
pImage->cmprof_ = 0;
jas_stream_seek(pImage->cmpts_[iCmp]->stream_, 0, SEEK_SET);
jas_stream_write(pImage->cmpts_[iCmp]->stream_, pInput, size);
pStream = jas_stream_fopen("C:\\jaspimage.jp2" , "w+b");
int copied = 0;
if (pStream)
{
char optionsString[128];
optionsString[0] = '\0';
int format = jas_image_strtofmt("jp2");
jas_image_encode(pImage, pStream, format, "rate=1.0");
jas_stream_close(pStream);
}
jas_image_destroy(pImage);
}
}
Я подтвердил порядковый номер, используя ImageJ. Это говорит, что порядковый номер немного ложный.
1 ответ
Как указать порядок байтов в яшме?
Вы не можете.
Ни в его документации ничего не говорится об этом, ни в src нет ничего связанного с этим.
Вы можете переключить порядок байтов вручную, что может привести к дополнительному снижению производительности (что, даже если библиотека поддерживает эту функцию, вам все равно придется с ней справиться).
Однако, как упомянул @MatthewPope, вы можете попробовать перевернуть только данные Exif (подробнее см. Как я могу изменить порядковый номер моего файла с exiftool?), Например, так:
exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg
Этот подход будет значительно быстрее, чем вышеупомянутый, так как размер данных Exif в большинстве случаев по меньшей мере на один порядок меньше, чем весь файл.
Википедия утверждает, что размер метаданных Exif ограничен до 64 кБ в изображениях JPEG, что, если оно истинно, в ~812 раз меньше, чем размеры изображений, с которыми вы работаете.
ExifTool может использоваться для редактирования метаинформации в изображении. Прочтите также этот интересный вопрос: Какое значение имеет порядковый номер JPEG при кодировании?