{picLeft, picRight, picTop, picBottom} = If( 1, picURL = "
https://upload.wikimedia.org/wikipedia/commons/1/1e/Rooster_-_Public_Domain.jpg"; // Lisafern, CC0, vía Wikimedia Commons --
https://commons.wikimedia.org/wiki/Special:ListFiles/lisafern {600000, 6000000, 35, 5};// , // picURL = "
https://upload.wikimedia.org/wikipedia/commons/3/3a/Foster_graph_hamiltonian.png"; // dominio público:
https://commons.wikimedia.org/wiki/File:Foster_graph_hamiltonian.png {450000, 10000000, 32, 8};// ); gTempFiles = Convertir ruta de archivo( "$temp\pil_webp\", "windows" ); Eliminar directorio( gTempFiles ); // ¡Cuidado! Crear directorio( gTempFiles ); // el directorio existe y está vacío // carga Python y asegúrate de que PIL esté disponible... rc = Python Execute( {}, {}, "\[from PIL import Image, ImageSequence import numpy as np import os import time def rmse(imageA, imageB): if imageA.size != imageB.size: raise ValueError("Las imágenes deben tener las mismas dimensiones para calcular RMSE") imgA_np = np.asarray(imageA).astype("float") imgB_np = np.asarray(imageB).astype("float") err = np.sum((imgA_np - imgB_np) ** 2) err /= float(imageA.size[0] * imageA.size[1]) return np.sqrt(err) ]\", echo( 0 ) ); If( rc != 0, Throw( "python init error rc=" || Char( rc ) ), "ok" ); // agrega una imagen JSL a una lista de archivos para un .webp y .jpg y .gif addNewFrame = Function( {filename, img}, img << saveimage( gTempFiles || filename || ".png", "png" ); // png no tiene pérdida y el rmse lo usa para comparación File Size( gTempFiles || filename || ".png" ); ); // las funciones saveFrameTo... y saveFramesTo... // reflejan la forma en que normalmente se usan los formatos; // normalmente no harías un GIF de un solo cuadro // y realmente no puedes hacer un JPG de varios cuadros. saveFrameToWebP = Function( {outputfilename, qual}, {filelist, webpname, rc}, // filelist = Transform Each( {f}, Files In Directory( gTempFiles ), // Convert File Path( gTempFiles || f, "windows" );// ); If( N Items( filelist ) != 1, // Throw( "saveFrameToWebP nitems=" || Char( N Items( filelist ) ) );// ); webpname = Convert File Path( outputfilename, "windows" ); rc = Python Execute( {filelist, webpname, qual}, // entradas {_rmse, _ossize, _timew, _timer}, // salidas "\[#
https://pillow.readthedocs.io/es/stable/handbook/image-file-formats.html#webp imgs = [] for f in filelist: imgs.append(Imagen.open(f).convert('RGB')) img=imgs[0] _timew = tiempo.perf_counter() img.save(nombrewebp,save_all=Verdadero,formato="WEBP",minimizar_tamaño=Verdadero,sin pérdida=Falso,calidad=int(qual)) _timew = tiempo.perf_counter() - _timew _timer = tiempo.perf_counter() ir = Imagen.open(nombrewebp).convert('RGB') _timer = tiempo.perf_counter() - _timer _rmse = rmse(img,ir) _ossize = os.path.getsize(nombrewebp) imgs = None ]\", echo( 0 ) ); If( rc != 0, // Throw( "saveFrameToWebP error rc=" || Char( rc ) );// , // Eval List( {_rmse, _ossize, _timew, _timer} );// valor de retorno ); ); saveFrameToPng = Function( {outputfilename, qual}, {filelist, pngname, rc}, // filelist = Transform Each( {f}, Files In Directory( gTempFiles ), // Convert File Path( gTempFiles || f, "windows" );// ); If( N Items( filelist ) != 1, // Throw( "saveFrameToPng nitems=" || Char( N Items( filelist ) ) );// ); pngname = Convert File Path( outputfilename, "windows" ); rc = Python Execute( {filelist, pngname, qual}, // inputs {_rmse, _ossize, _timew, _timer}, // outputs "\[# imgs = [] for f in filelist: imgs.append(Image.open(f).convert('RGB')) img=imgs[0] _timew = time.perf_counter() img.save(pngname,save_all=True,format="PNG", optimize=True, quality=int(qual)) _timew = time.perf_counter() - _timew _timer = time.perf_counter() ir = Image.open(pngname).convert('RGB') _timer = time.perf_counter() - _timer _rmse = rmse(img,ir) _ossize = os.path.getsize(pngname) imgs = None ]\", echo( 0 ) ); If( rc != 0, // Throw( "saveFrameToWebP error rc=" || Char( rc ) );// , // Eval List( {_rmse, _ossize, _timew, _timer} );// valor de retorno ); ); saveFrameToJPG = Function( {outputfilename, qual}, {filelist, jpgname, rc}, // filelist = Transform Each( {f}, Files In Directory( gTempFiles ), // Convert File Path( gTempFiles || f, "windows" );// ); If( N Items( filelist ) != 1, // Throw( "saveFrameToJPG nitems=" || Char( N Items( filelist ) ) );// ); jpgname = Convert File Path( outputfilename, "windows" ); rc = Python Execute( {filelist, jpgname, qual}, // inputs {_rmse, _ossize, _timew, _timer}, // outputs "\[#
https://pillow.readthedocs.io/es/stable/handbook/image-file-formats.html#webp imgs = [] for f in filelist: imgs.append(Imagen.open(f).convert('RGB')) img=imgs[0] _timew = tiempo.perf_counter() img.save(nombrejpg,formato="JPEG", optimizar=Verdadero, calidad=int(qual)) _timew = tiempo.perf_counter() - _timew _timer = tiempo.perf_counter() ir = Imagen.open(nombrejpg).convert('RGB') _timer = tiempo.perf_counter() - _timer _rmse = rmse(img,ir) _ossize = os.path.getsize(nombrejpg) imgs = None ]\", echo( 0 ) ); Si( rc != 0, // Lanzar( "saveFrameToJPG error rc=" || Char( rc ) );// , // Lista de evaluación( {_rmse, _ossize, _timew, _timer} );// valor de retorno ); ); // Lisafern, CC0, vía Wikimedia Commons --
https://commons.wikimedia.org/wiki/Special:ListFiles/lisafern img = Nueva imagen( picURL ); inicio = HP Time(); pngSize1 = addNewFrame( "1jsl.png", img ); JSLpngTime = (HP Time() - inicio) / 1e6; dt = Nueva tabla( // Nueva columna( "extensión", "carácter" ), Nueva columna( "tamaño" ), Nueva columna( "timewrite" ), Nueva columna( "timeread" ), Nueva columna( "rmse" ) ); dt << addrows( 1 ); extensión = "JSLPng"; tamaño = pngSize1; rmse = 0; timewrite = JSLpngTime; dt << addrows( 1 ); extensión = "PILPng"; {rmse, tamaño, tiempo de escritura, tiempo de lectura} = saveFrameToPng( "$temp/1.png", 95 ); For( i = 0, i <= 100, i += 1, dt << addrows( 1 ); extension = "WebP"; {rmse, tamaño, tiempo de escritura, tiempo de lectura} = saveFrameToWebP( "$temp/1.webp", i ); Wait( .01 ); dt << addrows( 1 ); extension = "Jpg"; {rmse, tamaño, tiempo de escritura, tiempo de lectura} = saveFrameToJpg( "$temp/1.jpg", i ); Wait( .01 ); ); dt << Constructor de gráficos( Tamaño( 996, 713 ), Mostrar panel de control( 0 ), Posición de leyenda( "Flotante interno" ), Variables( X( :size ), Y( :rmse ), Superposición( :extension ), Tamaño( :timewrite ) ), Elementos( Puntos( X, Y, Leyenda( 47 ) ) ), Enviar a informe( Despacho( {}, "size", ScaleBox, {Escala( "Log" ), Formato( "Engineering SI", 12 ), Mín( 1e4 ), Máx( 6.1e6 ), Marcas menores( 1 ), Fila de etiquetas( {Mostrar cuadrícula principal( 1 ), Mostrar cuadrícula menor( 1 ), Mostrar etiquetas menores( 1 )} )} ), Despacho( {}, "rmse", ScaleBox, {Mín( -0.5 ), Máx( 32 ), Aum( 5 ), Marcas menores( 0 )} ), Dispatch( {}, "400", ScaleBox, {Legend Model( 47, Type Properties( 0, "Marker", {Marker( "FilledCircle" )} ), Properties( 1, {Line Color( 3 ), Marker( "FilledCircle" )}, Item ID( "Jpg", 1 ) ), Properties( 2, {Line Color( 5 ), Marker( "FilledCircle" )}, Item ID( "JSLPng", 1 ) ), Properties( 3, {Line Color( 6 ), Marker( "FilledCircle" )}, Item ID( "PILPng", 1 ) ), Properties( 4, {Line Color( 8 ), Marker( "FilledCircle" )}, Item ID( "WebP", 1 ) ), Properties( -1, {Marker( "FilledSquare" )}, Item ID( "Png", 1 ) ) )} ), Dispatch( {}, "título del gráfico", TextEditBox, {Establecer texto( "WebP vs Jpg vs Png" )} ), Dispatch( {}, "tamaño", TextEditBox, {Establecer texto( "Tamaño en disco, bytes" )} ), Dispatch( {}, "rmse", TextEditBox, {Establecer texto( "RMSE de 255" )} ), Dispatch( {}, "Generador de gráficos", FrameBox, {Modo de dibujo de marcadores( "Normal" ), Orden de línea de referencia( 6 ), Agregar imagen( 2, // capa 2 sobre las líneas de cuadrícula image( Nueva imagen( picURL ) ), Límites( Izquierda( picLeft ), Derecha( picRight ), Superior( picTop ), Inferior( picBottom ) ) ), Agregar script de gráficos( 7, Descripción( "" ), Vacío() )} ), Dispatch( {}, "400", LegendBox, {Posición de la leyenda( {47, [4, 0, 3, 2, 1]} )} ) ) ); dt << Graph Builder( Tamaño( 638, 370 ), Mostrar panel de control( 0 ), Variables( X( :size ), Y( :timeread ), Superposición( :extension ) ), Elementos( Puntos( X, Y, Leyenda( 9 ) ) ), Enviar a informe( Despacho( {}, "400", ScaleBox, {Leyenda Modelo( 9, Propiedades( 0, {Color de línea( 3 )}, ID de elemento( "Jpg", 1 ) ), Propiedades( 1, {Color de línea( 5 )}, ID de elemento( "JSLPng", 1 ) ), Propiedades( 2, {Color de línea( 6 )}, ID de elemento( "PILPng", 1 ) ), Propiedades( 3, {Color de línea( 8 )}, ID de elemento( "WebP", 1 ) ) )} ), Despacho( {}, "400", LegendBox, {Leyenda Posición( {9, [0, 3, 2, 1]} )} ) ) );