Канал AVIF-ALPHA не работает должным образом, и для изображения AVIF используется библиотека libavif.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Канал AVIF-ALPHA не работает должным образом, и для изображения AVIF используется библиотека libavif.

Сообщение Anonymous »

В настоящее время я использую библиотеку

Код: Выделить всё

'libavif'
для изображений .Avif и использования с каналом avif-alpha.
Вот поведение avif и avif-alpha .
Изображение с avif-alpha:
Изображение

Изображение с avif:
Изображение
Итак здесь есть контуры в avif-alpha.
вот код, который я использую, получил avif-alpha и avif:

Код: Выделить всё

IgcBufBase::Ptr IsrvImageRects::CreateAvifImage(IrsRasConst ras, int /* format */, int ippEncoding, int quality, bool doAlpha, size_t * length)
{
IrsRas avifRas = CreateRasForAvif(ras, doAlpha);
int depth = 8;
int height = avifRas.rect().ht();
int width = avifRas.rect().wd();
avifPixelFormat format = AVIF_PIXEL_FORMAT_YUV420;

IrsTAccessConst pixels(avifRas);

avifRGBImage rgb;
avifImage * image = avifImageCreate(width, height, depth, format);
avifRGBImageSetDefaults(&rgb, image);
image->colorPrimaries = AVIF_COLOR_PRIMARIES_BT709;
image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB;
image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601;
rgb.pixels=(uint8_t*)  pixels.ptr();
rgb.rowBytes=avifRas.numComps() * avifRas.rect().wd();

if (avifRas.numComps() == 4) {
rgb.format = AVIF_RGB_FORMAT_RGBA;
} else {
rgb.format = AVIF_RGB_FORMAT_RGB;
}

if (avifImageRGBToYUV(image, &rgb) != AVIF_RESULT_OK) {
avifImageDestroy(image);
throw new IgcEx_Unsupported("AVIF format - Problem in RGB(A) to YUV conversion", IGC_WHERE);
}

avifRWData encodedData = AVIF_DATA_EMPTY;
avifEncoder * encoder = NULL;
encoder = avifEncoderCreate();
encoder->codecChoice=AVIF_CODEC_CHOICE_AUTO;
encoder->maxThreads = 2;
encoder->speed = 8;
encoder->quality = quality;

if ( avifEncoderWrite(encoder, image, &encodedData) != AVIF_RESULT_OK) {
avifEncoderDestroy(encoder);
avifImageDestroy(image);
throw new IgcEx_Unsupported("AVIF format - Encoding Failed", IGC_WHERE);
}

avifEncoderDestroy(encoder);
avifImageDestroy(image);

IgcBufSpec spec(encodedData.size);
IgcBufBase::Ptr buf = IgcBufBase::Create(spec);
memcpy(buf->buf(), encodedData.data,encodedData.size);

*length = encodedData.size;
avifRWDataFree(&encodedData);
return buf;
}
Пожалуйста, дайте мне знать, чего мне не хватает или что мне нужно добавить, чего мне не хватает для использования.
Заранее спасибо, будем признательны.
Я пробовал другие варианты, предоставленные в библиотеке (libavif), которую я использую, но безуспешно.

Подробнее здесь: https://stackoverflow.com/questions/785 ... r-avif-ima
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»