PDA

Ver la Versión Completa : Nuevo formato de imagen para la web - WEBP


Maniches
03-05-2020, 18:45:18
Hola Amig@s del foro
He estado investigando con respecto a este formato y hacer que delphi lo soporte.
He buscado en foros y he logrado encontrar la librería DLL y la definición de usar la librería que Google proporciona.

He intentado hacer la conversión de un archivo *.BMP hacia *.Webp obteniendo un resultado de BMP(655kb) y WebP(134kb).
el problema que está ocurriendo es que no está respetando los colores de la imagen original. tiene la misma claridad, pero no los mismos colores.

les adjunto una imagen para que vean el resultado. les comparto parte del código y me ayudan con sus sugerencias o que puede estar haciéndose erradamente.

Definición de función que usa la librería:


{$if defined(Win32)}
LIB_WEBP = 'libwebp.dll';
{$elseif defined(Win64)}
LIB_WEBP = 'libwebp64.dll';

function WebPEncodeBGR(const bgr: PByte; width, height, stride: Integer; quality_factor: Single; var output: PByte): Cardinal; cdecl; external LIB_WEBP;


procedimiento que hace la conversión: (Se carga la imagen bmp al objeto TIMAGE)


imgConvertir: TImage;

procedure TForm1.btnConvertirWebPClick(Sender: TObject);
var
src, dst: TBytes;
data, pb: PByte;
iy, wdt, hgt, datasize, stride: Integer;
bmp: TBitmap;
begin
bmp := TBitmap.Create; {Converting to Bitmap}
bmp.PixelFormat := pf24bit;
bmp.Width := imgConvertir.Picture.Width;
bmp.Height := imgConvertir.Picture.Height;
bmp.Canvas.Draw(0, 0, imgConvertir.Picture.Graphic);
stride := NativeInt(bmp.ScanLine[1]) - NativeInt(bmp.ScanLine[0]);
datasize := WebPEncodeRGB(bmp.ScanLine[0], bmp.Width, bmp.Height, stride, 100, data);
SetLength(src, datasize);
MoveMemory(src, data, datasize);
TFile.WriteAllBytes(ExtractFilePath(Application.ExeName)+'\tiger.webp', src);
bmp.Free;


¿Qué sugerencia u opiniones? ¿capaz se está enviando los parámetros de forma errada?
Es muy interesante usar este formato liviano para los desarrollos web. Les dejo un link para que vean su información: https://developers.google.com/speed/webp

Neftali [Germán.Estévez]
04-05-2020, 12:27:38
En mi caso, ese cídigo me funciona perfectamente.
He utilizado Delphi Rio 10.3 y la v0.6.0 de la librería (en mi caso he probado con la de 32b).

Cosa curiosa es que los tamaños de imagen segun la documntación deberían ser estos:
"WebP lossless images are 26% smaller (https://developers.google.com/speed/webp/docs/webp_lossless_alpha_study#results) in size compared to PNGs. WebP lossy images are 25-34% smaller than comparable JPEG images at equivalent SSIM (https://en.wikipedia.org/wiki/Structural_similarity) quality index."

Los tamaños en mi caso para una imagen sencilla son los siguientes:
https://i.imgur.com/hTjNkX3.png

Maniches
06-05-2020, 00:02:18
Amigo Nefali,
quiero compartirte el codigo para que puedas verificar lo que indico y capaz me puedas sugerir cual es el problema.
Yo lo he probado con Delphi 10.3.3

Source:
https://mega.nz/file/6k9lkSQI#bEC6mfKZ3oao3gCbD01tCWIRh7nQLxrUldlKUssP8V4

Muchas Gracias. ^\||/

Neftali [Germán.Estévez]
06-05-2020, 11:59:17
El problema está en la unit libwebp.pas que estás usando.
Si llamas directamente a la DLL funciona correctamente. Imagino que la unit no está actualizada del todo o tiene algun bug.


Define la importación de la función:

function WebPEncodeBGR(const bgr: PByte; width, height, stride: Integer; quality_factor: Single;
var output: PByte): Cardinal; cdecl; external 'libwebp.dll';




Y utiliza la función WebPEncodeBGR directamente en tu código.

Maniches
07-05-2020, 06:36:17
Hola Neftali,
Tenias razon, he probado lo que mencionas y el ejemplo modificado ahora si esta funcionando. haciendo uso el ejemplo y con la libreria que adjunta el resultado es> *.webp 136.kb

entonces como mencionas y en base a la imagen que comparte tambien hice la convercion del archivo BMP hacia JPG utilizando varias herramientas: programa maneja imagenes, conversor en linea(media.io) y la libreria(ImageEn) usando sus demos de este ultimo. ahi comparto los resultados: Img1

He bajado las ultimas librerias de Google WebP (img2)

He ejecutado la conversion de la librerias mencionada en la img2 el resultado esta en la (img3)

como apreciaras el resultado con el archivo que comparti (*.bmp) si esta haciendo la conversion con un tamaño 36kb (img4)

al parecer si esta siendo menor la comprension del formato WebP, pero para ello no se como poder obtener la (*.dll) de la version 1.1.0 que es la ultima.

Si tu conoces la forma de obtener la ultima version de la DLL te agradeceria mucho para validarlo desde delphi si es cierto lo que indican de este formato.

Muchas gracias por tu apoyo.

Saludos. ^\||/

Neftali [Germán.Estévez]
07-05-2020, 09:19:05
Si te sirve, el compilado de la version 1.0.1 te lo adjunto al mensaje.

Maniches
09-05-2020, 18:37:52
Muchas gracias por tu apoyo Neftali.
Reemplace la dll y se obtiene el mismo resultado con el ejemplo que compartiste.

Sera motivo de encontrar la version 1.1.0 y hacer la prueba para obtener el resultado.

Saludos. ^\||/