Я кодирую необработанный байт в 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. Это говорит, что порядковый номер немного ложный.
Как указать порядок байтов в яшме?
Вы не могу.
Ни его документация ничего не упоминает об этом, ни его ЦСИ содержит что-нибудь связанное
Вы можете переключить порядок байтов вручную, что может привести к дополнительному снижению производительности (что, даже если библиотека поддерживает эту функцию, вам все равно придется с ней справиться).
Однако, как упомянул @MatthewPope, вы можете попробовать перевернуть только данные Exif (подробнее в Как я могу изменить порядковый номер моего файла с exiftool?) вот так например:
exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg
Этот подход будет значительно быстрее, чем вышеупомянутый, так как размер данных Exif в большинстве случаев по меньшей мере на один порядок меньше, чем весь файл.
Википедия утверждает, что размер метаданных Exif ограничен до 64 кБ в изображениях JPEG, что, если оно истинно, в ~ 812 раз меньше, чем размеры изображений, с которыми вы работаете.
ExifTool может использоваться для редактирования метаинформации в изображении. Прочитайте этот интересный вопрос тоже: Какое значение имеет порядковый номер JPEG при кодировании?
Других решений пока нет …