📄 jp2batch.pl
字号:
#!/usr/bin/perl -s -U# jp2batch.pl# OpenSim jp2 texture preparation script# Converts jpg/jpeg/bmp/tga files to valid jp2(jk2) files for SL# Author: Phrearch# Credits: Tedd1 $dirs=0;$files=0; sub ScanDirectory{ my ($workdir) = @_; local (@names); $dirs++;opendir(DIR, $workdir) or die "Unable to open $workdir:$!\n";@names = readdir(DIR) or die "Unable to read $workdir:$!\n";closedir(DIR); foreach my $tmpName (@names){ my $name = $workdir."/".$tmpName; #\. or \.. in directory if ($tmpName =~ /^\.\.?$/){ next; } #directory if (-d $name){ print "Entering directory $name\n"; &ScanDirectory($name); next; } #jpg or jpeg if ($name =~ /^(.*)\.(jpe?g|bmp|tga|tif|raw|png)$/){ $rawname = $1; $ext = lc($2); $files++; print "\nProcessing $name..."; &Convert($rawname,$ext); } } } sub Convert{my ($rawname, $ext) = @_;my @imageid = split(/ /,`identify $rawname.$ext`); my @imageXY = split('x',@imageid[2]);my $imageX = pop(@imageXY);my $imageY = pop(@imageXY);my $optX;my $optY;my $ar;my $optar; #landscape or square, search for optimal X if ($imageX >= $imageY){ $ar = sprintf("%.4f",$imageY / $imageX); $optar = &supportedAR($ar); $optX = &supportedXY($imageX); $optY = $optX * $optar; #both aspectratio and resolution are correct unless(($imageX==$optRes) && ($ar==$optar)) { print "\nResizing ($imageX\xx$imageY => $optY\xx$optX)..."; system(`convert -resize ${optX}x${optY}! $rawname.$ext $rawname.$ext >/dev/null`); print "Done"; } } #portrait, search for optimal Y else { $ar = sprintf("%.4f",$imageX / $imageY); $optar = &supportedAR($ar); $optY = &supportedXY($imageY); $optX = $optY * $optar; #Needs conversion unless(($imageY==$optRes) && ($ar==$optar)) { print "\nResizing ($imageX\xx$imageY => $optX\xx$optY)..."; system("convert -resize ${optX}x${optY}! $rawname.$ext $rawname.$ext >/dev/null"); print "Done"; } } if (($ext eq "jpg") || ($ext eq "jpeg") || ($ext eq "png")){ print "\nConverting jpg to valid openjpeg format..."; system("convert -format tga $rawname.$ext $rawname.tga >/dev/null"); system("rm $rawname.$ext >/dev/null"); print "Done"; $ext="tga"; }print "\nCreating jp2 file...";system("image_to_j2k -i $rawname.$ext -o $rawname.j2k -r 20,10,1 >/dev/null");system("mv $rawname.j2k $rawname.jp2 >/dev/null");system("rm $rawname.$ext >/dev/null");print "Done\n";} sub supportedAR{my ($ar) = @_;my @arReference=(1.0,0.5,0.25,0.125,0.0625);my $arOptimal;my $arDivTemp=1.0;my $arDiv; #Get optimal aspect ratio foreach (@arReference){ $arDiv=abs($ar-$_); if($arDiv < $arDivTemp) { $arDivTemp=$arDiv; $arOptimal=$_; } }return $arOptimal;} sub supportedXY{my ($res) = @_;my @resReference=(64.0,128.0,256.0,512.0,1024.0);my $resOptimal;my $resDivTemp=4096.0;my $resDiv; #Get optimal axis resolution foreach (@resReference){ $resDiv=abs($res-$_); if($resDiv < $resDivTemp) { $resDivTemp=$resDiv; $resOptimal=$_; } }return $resOptimal;} if ( @ARGV > 0 ){print "Processing ".@ARGV[0]."...\n";&ScanDirectory(@ARGV[0]);print "\nDirectories scanned:$dirs\nFiles processed:$files\n" ;}else {print "Provide a directory to process...\n";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -