#------------------------------------------------------------------------------- # Arquivo: aspect_ratio.config # # # Descrição: Script para calcular a razão de aspecto (fracionária e decimal) # baseado nas tags "ImageWidth" e "ImageHeight" de uma imagem. # Também determina o formato da imagem: quadrado, retrato ou # paisagem. Com atalhos curtos. # # # Notas: Ver https://en.wikipedia.org/wiki/Aspect_ratio_(image) definição do \ # "Aspect Ratio". # # # Exemplos: # > exiftool -config aspect_ratio.config -imagesize -AspectRatioStorage \ # -AspectRatioDecimalFormat -AspectRatioProportionFactor \ # -LayoutOrientation -TotalPixels -UserParam RatioLength=128 image.png # -AspectRatioStorage -AspectRatioDecimalFormat -AspectRatioProportionFactor \ # -LayoutOrientation -EstimatedAspectRatio -TotalPixels \ # -UserParam RatioLength=[3-512] # # Image Size : 1920x1440 # Aspect Ratio : 4:3 # Aspect Ratio Decimal Format : 1.33:1 # Aspect Ratio Factor Proportion : 1.333 # Layout Orientation : Landscape # # > exiftool -config aspect_ratio.config -ImageSize -ImageSize -AR -ARDF \ # -ARPF -LTO -TP -UserParam ARPFL=64 image.png # -AR -ARDF -ARPF -LTO -EAR -TP -UserParam ARPFL=[3-512] # # Image Size : 100x100 # Aspect Ratio : 1:1 # Aspect Ratio Decimal Format : 1:1 # Aspect Ratio Proportion Factor : 1.000 # Layout Orientation : Square # # # Testes/Simulações: # > magick -size 3840x1574 xc:white jpg:- | exiftool -config \ # aspect_ratio.config -ImageSize -AspectRatioStorage \ # -AspectRatioDecimalFormat -AspectRatioProportionFactor -LayoutOrientation - # # > magick -size 3840x1574 xc:white jpg:- | exiftool -config \ # aspect_ratio.config -ImageSize -AspectRatioStorage \ # -aspectratiodecimalformat -aspectratioproportionfactor -layoutorientation - # # > magick -size 3840x1574 xc:white jpg:- | exiftool \ # -config aspect_ratio.config -ImageSize -AR -ARDF -ARPF -LTO - # # > magick -size 3840x1574 xc:white 3840x1574.jpg | exiftool -config \ # aspect_ratio.config -ImageSize -AspectRatioStorage \ # -AspectRatioDecimalFormat -AspectRatioProportionFactor -LayoutOrientation - # #? https://www.unravel.com.au/aspect-ratio-cheat-sheet, no caso de vídeos \ # "486p (NTSC D1 SD)". # > ffmpeg -y -f lavfi -i color=c=white:s=720x576:d=1 -aspect 16:9 -c:v \ # libx264 -pix_fmt yuv420p -loglevel quiet /tmp/out.m4v && exiftool \ # -config aspect_ratio.config -ImageSize -AR -ARDF -ARPF -LTO \ # /tmp/out.m4v && rm /tmp/out.m4v # > ffmpeg -y -f lavfi -i color=c=white:s=720x486:d=1 -aspect 4:3 -c:v \ # libx264 -pix_fmt yuv420p -loglevel quiet /tmp/out.m4v && exiftool \ # -config aspect_ratio.config -ImageSize -AR -ARDF -ARPF -LTO \ # /tmp/out.m4v && rm /tmp/out.m4v # # # Ano/Mês/Dia # Reviews: 2024/09/05 - ArchZu \ # Editado: gcd, AspectRatio, ImageFormat. \ # Adicionado: AspectRatio, AspectRatioDecimalFormat, \ # AspectRatioProportionFactor, LayoutOrientation, \ # EstimatedAspectRatio, ValueEquationAspectRatio # # # Contribuições: Christian W Correa (ExifTool Forum), \ # StarGeek (ExifTool Forum), Alan Clifford (ExifTool Forum), \ # Audrey Cochran (SMPTE Education) #------------------------------------------------------------------------------- #! Para poder fazer contas gigantes, parece usar por padrão o IEEE 754 com 15-17 digitos significativos de precisão após o separador decimal. use Math::BigFloat; #! Defina a precisão desejada, 1024 digitos após a casa decimal Math::BigFloat->accuracy(1024); #! Mapear atalhos curtos para as tags %Image::ExifTool::UserDefined::Shortcuts = ( 'ARS' => 'AspectRatioStorage', #? https://en.wikipedia.org/wiki/List_of_common_display_resolutions 'ARDF' => 'AspectRatioDecimalFormat', 'ARPF' => 'AspectRatioProportionFactor', 'LTO' => 'LayoutOrientation', 'EAR' => 'EstimatedAspectRatio', #* Evitar usar, pois não é exato! 'VEAR' => 'ValueEquationAspectRatio', #* O útimo número é arredondado 'TP' => 'TotalPixels', ); #! Função para calcular o Máximo Divisor Comum (MDC) sub gcd { my ($a, $b) = @_; #* Certifique-se de que ambos os números são Math::BigFloat com a precisão correta $a = Math::BigFloat->new($a) unless ref($a) eq 'Math::BigFloat'; $b = Math::BigFloat->new($b) unless ref($b) eq 'Math::BigFloat'; #* Use o método bmod para o cálculo do módulo e is_zero para a verificação de zero return $a if $b->is_zero(); # Se $b for zero, retorna $a return gcd($b, $a->copy()->bmod($b)); # Recursão com o módulo calculado } #! Função para ajustar a precisão da string resultante | format_precision($result, 2); sub format_precision { my ($number, $precision) = @_; my $formatted = $number->bstr(); my $decimal_pos = index($formatted, '.'); if ($decimal_pos != -1) { #* Ajustar para a precisão desejada $formatted = substr($formatted, 0, $decimal_pos + $precision + 1); } return $formatted; } #! Função para remover todos os caracteres '.' e formatar o número sub remove_dots { my ($number) = @_; my $formatted = $number->bstr(); #* Converte para string $formatted =~ s/\.//g; #* Remove todos os pontos return $formatted; } %Image::ExifTool::UserDefined = ( 'Image::ExifTool::Composite' => { #* Razão de aspecto fracionária AspectRatioStorage => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ #* Obtenha a largura e altura como BigFloat my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Função para calcular o MDC usando BigFloat sub gcd { my ($a, $b) = @_; $a = Math::BigFloat->new($a) unless ref($a) eq 'Math::BigFloat'; $b = Math::BigFloat->new($b) unless ref($b) eq 'Math::BigFloat'; return $a if $b->is_zero(); return gcd($b, $a->copy()->bmod($b)); } #* Calcular MDC my $gcd = gcd($width, $height); #* Calcular a razão fracionária my $numerator = $width->copy()->bdiv($gcd); #* width / gcd my $denominator = $height->copy()->bdiv($gcd); #* height / gcd # #* Formata Com duas casas decmais, nesse formato: 0.00 # my $numerator = format_precision($numerator, 0); # my $denominator = format_precision($denominator, 0); # #* Remove o último dígito se for ponto, bom para usar com o format_precision($numerator, 0); # $numerator =~ s/\.$//; # $denominator =~ s/\.$//; #* Retornar a razão no formato "numerator:denominator" # return "$numerator:$denominator"; #* Retornar a razão no formato "numerator:denominator" return sprintf("%.0f:%.0f", $numerator, $denominator); }, }, #! Razão de aspecto no formato decimal AspectRatioDecimalFormat => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ #* Obtenha a largura e altura como BigFloat my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Dividir o primeiro valor pelo segundo my $result = $width->copy()->bdiv($height); #* Retornar o resultado com a precisão desejada 512. no caso deixei 2 my $result = format_precision($result, 3); $result = sprintf("%.2f", $result); #* Isso vai retornar o numero arredondado #* $result =~ s/\d$//; #* Remove o último dígito $result =~ s/(\.0+|(?<=\.\d)0+)$//; #* Remove zeros desnecessários 2:1 $result .= ":1"; #* Adiciona ":1" ao final return $result; }, }, #! Fator de proporção da razão de aspecto AspectRatioProportionFactor => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ #* Defina a precisão desejada Math::BigFloat->accuracy(1000); #* Obtenha a largura e altura dos valores my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Calcular a razão utilizando BigFloat my $aspect_ratio = $width->copy()->bdiv($height); #* Divisão usando bdiv para garantir precisão #* Definir o UserParam [-UserParam RatioLength=512|-UserParam ARPFL=512] my $fmt = $self->Options(UserParam => 'RatioLength') || $self->Options(UserParam => 'ARPFL') || 3; #* Verificar se $fmt é um número e se é menor ou igual a 512 if ($fmt =~ /^\d+$/ && $fmt >= 3 && $fmt <= 512) { return format_precision($aspect_ratio, $fmt); #* Ajustar a precisão conforme necessário } else { #* Se $fmt não é um número válido ou é maior que 3, usar 3 como padrão return format_precision($aspect_ratio, 3); #* Ajustar a precisão conforme necessário } }, }, #! Orientação da imagem LayoutOrientation => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ my $width = $val[0]; my $height = $val[1]; #* Determinar a orientação com base no aspecto da imagem if ($width == $height) { return 'Square'; #* Quadrado } elsif ($width > $height) { return 'Landscape'; #* Paisagem } else { return 'Portrait'; #* Retrato } }, }, #! Função principal para calcular e encontrar a proporção exata | find_exact_aspect_ratio EstimatedAspectRatio => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ #* Obtenha a largura e altura dos valores my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Calcular a razão utilizando BigFloat my $aspect_ratio = $width->copy()->bdiv($height); #* Divisão usando bdiv para garantir precisão #* Ajustar a precisão conforme necessário # $aspect_ratio = format_precision($aspect_ratio, 128); #? https://en.wikipedia.org/wiki/Display_resolution_standards [2024/09/07] #? https://en.wikipedia.org/wiki/Aspect_ratio_(image) [2024/09/07] #? https://www.masterclass.com/articles/guide-to-aspect-ratios #? https://borisfx.com/blog/what-is-aspect-ratio-common-aspect-ratios/ #? https://www.wearethefirehouse.com/aspect-ratio-cheat-sheet #? https://www.widescreen.org/aspect_ratios.shtml #? https://www.eace.no/Stills/Aspect.html #? Definindo proporções padrão comuns com seus valores my %standard_ratios = ( #! Lista basica Wikipedia: https://upload.wikimedia.org/wikipedia/commons/0/0c/Vector_Video_Standards8.svg # '1:1' => Math::BigFloat->new(1 / 1), # '5:4' => Math::BigFloat->new(5 / 4), # '4:3' => Math::BigFloat->new(4 / 3), # '3:2' => Math::BigFloat->new(3 / 2), # '16:10' => Math::BigFloat->new(16 / 10), # '8:5' => Math::BigFloat->new(8 / 5), # '5:3' => Math::BigFloat->new(5 / 3), # '16:9' => Math::BigFloat->new(16 / 9), # '17:9' => Math::BigFloat->new(17 / 9), # '21:9' => Math::BigFloat->new(21 / 9), # '7:3' => Math::BigFloat->new(7 / 3), #! links da Wikipedia: https://en.wikipedia.org/wiki/Display_resolution_standards https://en.wikipedia.org/wiki/Aspect_ratio_(image) '1.19:1' => Math::BigFloat->new(1.19 / 1), '1.22:1' => Math::BigFloat->new(1.22 / 1), '1.25:1' => Math::BigFloat->new(1.25 / 1), '1.32:1' => Math::BigFloat->new(1.32 / 1), '1.33:1' => Math::BigFloat->new(1.33 / 1), '1.37:1' => Math::BigFloat->new(1.37 / 1), '1.375:1' => Math::BigFloat->new(1.375 / 1), '1.43:1' => Math::BigFloat->new(1.43 / 1), '1.5:1' => Math::BigFloat->new(1.50 / 1), '1.6:1' => Math::BigFloat->new(1.60 / 1), '1.66:1' => Math::BigFloat->new(1.66 / 1), '1.85:1' => Math::BigFloat->new(1.85 / 1), '1.875:1' => Math::BigFloat->new(1.875 / 1), '1.9:1' => Math::BigFloat->new(1.90 / 1), '1.94:1' => Math::BigFloat->new(1.94 / 1), '101:80' => Math::BigFloat->new(101 / 80), '1:3' => Math::BigFloat->new(10 / 3), '1:7' => Math::BigFloat->new(10 / 7), '1:9' => Math::BigFloat->new(10 / 9), '11:5' => Math::BigFloat->new(11 / 5), '11:8' => Math::BigFloat->new(11 / 8), '128:53' => Math::BigFloat->new(128 / 53), '128:75' => Math::BigFloat->new(128 / 75), '12:1' => Math::BigFloat->new(12 / 1), '12:5' => Math::BigFloat->new(12 / 5), '12:7' => Math::BigFloat->new(12 / 7), '12:9' => Math::BigFloat->new(12 / 9), #* '1316' => Math::BigFloat->new(1316), '13:11' => Math::BigFloat->new(13 / 11), '14:9' => Math::BigFloat->new(14 / 9), '15:4' => Math::BigFloat->new(15 / 4), '15:9' => Math::BigFloat->new(15 / 9), '16:10' => Math::BigFloat->new(16 / 10), '16:15' => Math::BigFloat->new(16 / 15), '16:5' => Math::BigFloat->new(16 / 5), '16:9' => Math::BigFloat->new(16 / 9), '1.75:1' => Math::BigFloat->new(1.75 / 1), '1.77:1' => Math::BigFloat->new(1.77 / 1), '1.78:1' => Math::BigFloat->new(1.78 / 1), '18:5' => Math::BigFloat->new(18 / 5), '18:91' => Math::BigFloat->new(180 / 91), #* '18½:9' => Math::BigFloat->new(18 / 9), '19:9' => Math::BigFloat->new(19 / 9), '19:16' => Math::BigFloat->new(19 / 16), #* '19½:9' => Math::BigFloat->new(19 / 9), '1:1' => Math::BigFloat->new(1 / 1), '2.165:1' => Math::BigFloat->new(2.165 / 1), '2.208:1' => Math::BigFloat->new(2.208 / 1), '2.21:1' => Math::BigFloat->new(2.21 / 1), '2.35:1' => Math::BigFloat->new(2.35 / 1), '2.39:1' => Math::BigFloat->new(2.39 / 1), '2.55:1' => Math::BigFloat->new(2.55 / 1), '2.59:1' => Math::BigFloat->new(2.59 / 1), '2.6:1' => Math::BigFloat->new(2.60 / 1), '2.75:1' => Math::BigFloat->new(2.75 / 1), '2.76:1' => Math::BigFloat->new(2.76 / 1), '2:13' => Math::BigFloat->new(20 / 13), '2:19' => Math::BigFloat->new(20 / 19), '2:9' => Math::BigFloat->new(20 / 9), '21:16' => Math::BigFloat->new(21 / 16), '21:9' => Math::BigFloat->new(21 / 9), '222:125' => Math::BigFloat->new(222 / 125), '23:15' => Math::BigFloat->new(23 / 15), '23:30' => Math::BigFloat->new(23 / 30), '24:9' => Math::BigFloat->new(24 / 9), '24:10' => Math::BigFloat->new(24 / 10), '24:25' => Math::BigFloat->new(24 / 25), '256:171' => Math::BigFloat->new(256 / 171), '25:11' => Math::BigFloat->new(25 / 11), '25:12' => Math::BigFloat->new(25 / 12), '25:16' => Math::BigFloat->new(25 / 16), '27:8' => Math::BigFloat->new(27 / 8), '28:13' => Math::BigFloat->new(28 / 13), '2:1' => Math::BigFloat->new(2 / 1), '3.5:1' => Math::BigFloat->new(3.5 / 1), '3.6:1' => Math::BigFloat->new(3.6 / 1), '3:17' => Math::BigFloat->new(30 / 17), '31:20' => Math::BigFloat->new(31 / 20), '31:24' => Math::BigFloat->new(31 / 24), '32:15' => Math::BigFloat->new(32 / 15), '32:25' => Math::BigFloat->new(32 / 25), '32:27' => Math::BigFloat->new(32 / 27), '32:9' => Math::BigFloat->new(32 / 9), '34:5' => Math::BigFloat->new(34 / 5), '35:12' => Math::BigFloat->new(35 / 12), '35:24' => Math::BigFloat->new(35 / 24), '35:26' => Math::BigFloat->new(35 / 26), '35:48' => Math::BigFloat->new(35 / 48), '37:20' => Math::BigFloat->new(37 / 20), '3:2' => Math::BigFloat->new(3 / 2), '4:27' => Math::BigFloat->new(40 / 27), '4:1' => Math::BigFloat->new(4.00 / 1), '427:240' => Math::BigFloat->new(427 / 240), '42:11' => Math::BigFloat->new(42 / 11), '43:18' => Math::BigFloat->new(43 / 18), '45:32' => Math::BigFloat->new(45 / 32), '45:62' => Math::BigFloat->new(45 / 62), '47:20' => Math::BigFloat->new(47 / 20), '47:30' => Math::BigFloat->new(47 / 30), '48:25' => Math::BigFloat->new(48 / 25), '48:35' => Math::BigFloat->new(48 / 35), '4:3' => Math::BigFloat->new(4 / 3), '4:5' => Math::BigFloat->new(4 / 5), '51:20' => Math::BigFloat->new(51 / 20), '51:32' => Math::BigFloat->new(51 / 32), '53:30' => Math::BigFloat->new(53 / 30), '54:35' => Math::BigFloat->new(54 / 35), '5:2' => Math::BigFloat->new(5 / 2), '5:3' => Math::BigFloat->new(5 / 3), '5:4' => Math::BigFloat->new(5 / 4), '5:8' => Math::BigFloat->new(5 / 8), '6:29' => Math::BigFloat->new(60 / 29), '64:27' => Math::BigFloat->new(64 / 27), '64:35' => Math::BigFloat->new(64 / 35), '64:45' => Math::BigFloat->new(64 / 45), '64:53' => Math::BigFloat->new(64 / 53), '667:375' => Math::BigFloat->new(667 / 375), '683:384' => Math::BigFloat->new(683 / 384), '69:25' => Math::BigFloat->new(69 / 25), '6:7' => Math::BigFloat->new(6 / 7), '7:27' => Math::BigFloat->new(70 / 27), '71:40' => Math::BigFloat->new(71 / 40), '72:35' => Math::BigFloat->new(72 / 35), '75:53' => Math::BigFloat->new(75 / 53), '75:64' => Math::BigFloat->new(75 / 64), '7:4' => Math::BigFloat->new(7 / 4), '8:39' => Math::BigFloat->new(80 / 39), '8:51' => Math::BigFloat->new(80 / 51), '812:375' => Math::BigFloat->new(812 / 375), '8:3' => Math::BigFloat->new(8 / 3), '8:5' => Math::BigFloat->new(8 / 5), '8:5.171' => Math::BigFloat->new(8 / 5.171), '8:5.178' => Math::BigFloat->new(8 / 5.178), '8:5.196' => Math::BigFloat->new(8 / 5.196), '8:5.2' => Math::BigFloat->new(8 / 5.2), '8:7' => Math::BigFloat->new(8 / 7), '96:65' => Math::BigFloat->new(96 / 65), '9:10' => Math::BigFloat->new(9 / 10), '9:5' => Math::BigFloat->new(9 / 5), '9:8' => Math::BigFloat->new(9 / 8), #! Todos os links # '1.19:9' => Math::BigFloat->new(1.19 / 9), # '1.2:1' => Math::BigFloat->new(1.20 / 1), # '1.22:1' => Math::BigFloat->new(1.22 / 1), # '1.25:1' => Math::BigFloat->new(1.25 / 1), # '1.32:1' => Math::BigFloat->new(1.32 / 1), # '1.33:1' => Math::BigFloat->new(1.33 / 1), # '1.37:1' => Math::BigFloat->new(1.37 / 1), # '1.375:1' => Math::BigFloat->new(1.375 / 1), # '1.43:1' => Math::BigFloat->new(1.43 / 1), # '1.5:1' => Math::BigFloat->new(1.50 / 1), # '1.6:1' => Math::BigFloat->new(1.60 / 1), # '1.66:1' => Math::BigFloat->new(1.66 / 1), # '1.76:1' => Math::BigFloat->new(1.76 / 1), # '1.75:1' => Math::BigFloat->new(1.75 / 1), # '1.77:1' => Math::BigFloat->new(1.77 / 1), # '1.78:1' => Math::BigFloat->new(1.78 / 1), # '1.85:1' => Math::BigFloat->new(1.85 / 1), # '1.875:1' => Math::BigFloat->new(1.875 / 1), # '1.9:1' => Math::BigFloat->new(1.90 / 1), # '1.94:1' => Math::BigFloat->new(1.94 / 1), # '1.96:1' => Math::BigFloat->new(1.96 / 1), # '101:80' => Math::BigFloat->new(101 / 80), # '1:3' => Math::BigFloat->new(10 / 3), # '1:7' => Math::BigFloat->new(10 / 7), # '1:9' => Math::BigFloat->new(10 / 9), # '11:5' => Math::BigFloat->new(11 / 5), # '11:8' => Math::BigFloat->new(11 / 8), # '128:53' => Math::BigFloat->new(128 / 53), # '128:75' => Math::BigFloat->new(128 / 75), # '12:1' => Math::BigFloat->new(12 / 1), # '12:5' => Math::BigFloat->new(12 / 5), # '12:7' => Math::BigFloat->new(12 / 7), # '12:9' => Math::BigFloat->new(12 / 9), # #* '1316' => Math::BigFloat->new(1316), # '13:11' => Math::BigFloat->new(13 / 11), # '14:9' => Math::BigFloat->new(14 / 9), # '15:4' => Math::BigFloat->new(15 / 4), # '15:9' => Math::BigFloat->new(15 / 9), # '16:10' => Math::BigFloat->new(16 / 10), # '16:15' => Math::BigFloat->new(16 / 15), # '16:5' => Math::BigFloat->new(16 / 5), # '16:9' => Math::BigFloat->new(16 / 9), # '18:5' => Math::BigFloat->new(18 / 5), # '18:91' => Math::BigFloat->new(180 / 91), # #* '18½:9' => Math::BigFloat->new(18 / 9), # '19:16' => Math::BigFloat->new(19 / 16), # '19:9' => Math::BigFloat->new(19 / 9), # #* '19½:9' => Math::BigFloat->new(19 / 9), # '1:1' => Math::BigFloat->new(1 / 1), # '2:1' => Math::BigFloat->new(2.00 / 1), # '2.05:1' => Math::BigFloat->new(2.05 / 1), # '2.1:1' => Math::BigFloat->new(2.1 / 1), # '2.13:1' => Math::BigFloat->new(2.13 / 1), # '2.165:1' => Math::BigFloat->new(2.165 / 1), # '2.208:1' => Math::BigFloat->new(2.208 / 1), # '2.21:1' => Math::BigFloat->new(2.21 / 1), # '2.2:1' => Math::BigFloat->new(2.20 / 1), # '2.35:1' => Math::BigFloat->new(2.35 / 1), # '2.37:1' => Math::BigFloat->new(2.37 / 1), # '2.39:1' => Math::BigFloat->new(2.39 / 1), # '2.4:1' => Math::BigFloat->new(2.40 / 1), # '2.43:1' => Math::BigFloat->new(2.43 / 1), # '2.44:1' => Math::BigFloat->new(2.44 / 1), # '2.55:1' => Math::BigFloat->new(2.55 / 1), # '2.59:1' => Math::BigFloat->new(2.59 / 1), # '2.6:1' => Math::BigFloat->new(2.60 / 1), # '2.65:1' => Math::BigFloat->new(2.65 / 1), # '2.66:1' => Math::BigFloat->new(2.66 / 1), # '2:13' => Math::BigFloat->new(20 / 13), # '2:19' => Math::BigFloat->new(20 / 19), # '2:9' => Math::BigFloat->new(20 / 9), # '21:16' => Math::BigFloat->new(21 / 16), # '21:9' => Math::BigFloat->new(21 / 9), # '222:125' => Math::BigFloat->new(222 / 125), # '23:15' => Math::BigFloat->new(23 / 15), # '23:30' => Math::BigFloat->new(23 / 30), # '24:9' => Math::BigFloat->new(24 / 9), # '24:10' => Math::BigFloat->new(24 / 10), # '24:25' => Math::BigFloat->new(24 / 25), # '256:171' => Math::BigFloat->new(256 / 171), # '25:11' => Math::BigFloat->new(25 / 11), # '25:12' => Math::BigFloat->new(25 / 12), # '25:16' => Math::BigFloat->new(25 / 16), # '27:8' => Math::BigFloat->new(27 / 8), # '28:13' => Math::BigFloat->new(28 / 13), # '2.75:1' => Math::BigFloat->new(2.75 / 1), # '2.76:1' => Math::BigFloat->new(2.76 / 1), # '2:1' => Math::BigFloat->new(2 / 1), # '3:17' => Math::BigFloat->new(30 / 17), # '3.5:1' => Math::BigFloat->new(3.5 / 1), # '3.6:1' => Math::BigFloat->new(3.6 / 1), # '31:20' => Math::BigFloat->new(31 / 20), # '31:24' => Math::BigFloat->new(31 / 24), # '32:15' => Math::BigFloat->new(32 / 15), # '32:25' => Math::BigFloat->new(32 / 25), # '32:27' => Math::BigFloat->new(32 / 27), # '32:9' => Math::BigFloat->new(32 / 9), # '34:5' => Math::BigFloat->new(34 / 5), # '35:12' => Math::BigFloat->new(35 / 12), # '35:24' => Math::BigFloat->new(35 / 24), # '35:26' => Math::BigFloat->new(35 / 26), # '35:48' => Math::BigFloat->new(35 / 48), # '37:20' => Math::BigFloat->new(37 / 20), # '3:2' => Math::BigFloat->new(3 / 2), # '4:1' => Math::BigFloat->new(4.00 / 1), # '4:27' => Math::BigFloat->new(40 / 27), # '427:240' => Math::BigFloat->new(427 / 240), # '42:11' => Math::BigFloat->new(42 / 11), # '43:18' => Math::BigFloat->new(43 / 18), # '45:32' => Math::BigFloat->new(45 / 32), # '45:62' => Math::BigFloat->new(45 / 62), # '47:20' => Math::BigFloat->new(47 / 20), # '47:30' => Math::BigFloat->new(47 / 30), # '48:25' => Math::BigFloat->new(48 / 25), # '48:35' => Math::BigFloat->new(48 / 35), # '4:3' => Math::BigFloat->new(4 / 3), # '4:5' => Math::BigFloat->new(4 / 5), # '51:32' => Math::BigFloat->new(51 / 32), # '51:32' => Math::BigFloat->new(51 / 32), # '53:30' => Math::BigFloat->new(53 / 30), # '54:35' => Math::BigFloat->new(54 / 35), # '5:2' => Math::BigFloat->new(5 / 2), # '5:3' => Math::BigFloat->new(5 / 3), # '5:4' => Math::BigFloat->new(5 / 4), # '5:8' => Math::BigFloat->new(5 / 8), # '6:29' => Math::BigFloat->new(60 / 29), # '64:27' => Math::BigFloat->new(64 / 27), # '64:35' => Math::BigFloat->new(64 / 35), # '64:45' => Math::BigFloat->new(64 / 45), # '64:53' => Math::BigFloat->new(64 / 53), # '667:375' => Math::BigFloat->new(667 / 375), # '683:384' => Math::BigFloat->new(683 / 384), # '69:25' => Math::BigFloat->new(69 / 25), # '6:7' => Math::BigFloat->new(6 / 7), # '7:27' => Math::BigFloat->new(70 / 27), # '71:40' => Math::BigFloat->new(71 / 40), # '72:35' => Math::BigFloat->new(72 / 35), # '75:53' => Math::BigFloat->new(75 / 53), # '75:64' => Math::BigFloat->new(75 / 64), # '7:4' => Math::BigFloat->new(7 / 4), # '8:39' => Math::BigFloat->new(80 / 39), # '8:51' => Math::BigFloat->new(80 / 51), # '812:375' => Math::BigFloat->new(812 / 375), # '8:3' => Math::BigFloat->new(8 / 3), # '8:5' => Math::BigFloat->new(8 / 5), # '8:5.171' => Math::BigFloat->new(8 / 5.171), # '8:5.178' => Math::BigFloat->new(8 / 5.178), # '8:5.196' => Math::BigFloat->new(8 / 5.196), # '8:5.2' => Math::BigFloat->new(8 / 5.2), # '8:7' => Math::BigFloat->new(8 / 7), # '96:65' => Math::BigFloat->new(96 / 65), # '9:10' => Math::BigFloat->new(9 / 10), # '9:16' => Math::BigFloat->new(9 / 16), # '9:5' => Math::BigFloat->new(9 / 5), # '9:8' => Math::BigFloat->new(9 / 8), ); #* Variáveis para encontrar a menor diferença my @closest_ratios = (); #* Para armazenar múltiplas proporções my $closest_diff = 9999; #* inicializa com um valor alto #* Encontra as proporções mais próximas foreach my $ratio (keys %standard_ratios) { my $diff = abs($aspect_ratio - $standard_ratios{$ratio}); if ($diff < $closest_diff) { #* Se encontrar um ratio mais próximo, redefine a lista @closest_ratios = ($ratio); $closest_diff = $diff; } elsif ($diff == $closest_diff) { #* Se a diferença for igual, adiciona à lista push @closest_ratios, $ratio; } } #* Ordena os ratios e retorna separados por vírgula return join(', ', sort { #* Comparação numérica de largura/altura de cada razão (split /:/, $a)[0] / (split /:/, $a)[1] <=> (split /:/, $b)[0] / (split /:/, $b)[1] } @closest_ratios); }, }, #! Exibe a proporção do fator do aspect ratio com o valor absoluto ValueEquationAspectRatio => { Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, ValueConv => q{ use Math::BigFloat; #* Defina a precisão desejada # Math::BigFloat->accuracy(512); #* Obtenha a largura e altura dos valores my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Calcule a razão #* my $aspect_ratio = $width / $height; my $aspect_ratio = $width->copy()->bdiv($height); #* Retorne a razão formatada como uma string return $aspect_ratio->bstr(); }, }, #! Definição personalizada do ExifTool para calcular o total de pixels TotalPixels => { #* Especificar que as tags necessárias para o cálculo são 'ImageWidth' e 'ImageHeight' Require => { 0 => 'ImageWidth', 1 => 'ImageHeight', }, #* O valor é calculado multiplicando 'ImageWidth' por 'ImageHeight' ValueConv => q{ #* Criar objetos Math::BigFloat obter a largura e altura dos valores my $width = Math::BigFloat->new($val[0]); my $height = Math::BigFloat->new($val[1]); #* Retornar o produto de largura * altura, que será o número total de pixels return sprintf("%.0f", $width->bmul($height)); }, }, }, ); 1; #! Fim do arquivo