-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptimize_jpegs.pl
More file actions
103 lines (86 loc) · 2.65 KB
/
optimize_jpegs.pl
File metadata and controls
103 lines (86 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/perl
#
# Lossless optimization for all JPEG files in a directory
#
# This script uses techniques described in this article about the use
# of jpegtran: http://www.phpied.com/installing-jpegtran-mac-unix-linux/
#
use strict;
use File::Find;
use File::Copy;
# Read image dir from input
if (!$ARGV[0]) {
print "Usage: $0 path_to_images\n";
exit 1;
}
my @search_paths;
my $images_path = $ARGV[0];
if (!-e $images_path) {
print "Invalid path specified.\n";
exit 1;
} else {
push @search_paths, $ARGV[0];
}
# Compress JPEGs
my $count_jpegs = 0;
my $count_modified = 0;
my $count_optimize = 0;
my $count_progressive = 0;
my $bytes_saved = 0;
my $bytes_orig = 0;
find(\&jpegCompress, @search_paths);
# Write summary
print "\n\n";
print "----------------------------\n";
print " Sumary\n";
print "----------------------------\n";
print "\n";
print " Inspected $count_jpegs JPEG files.\n";
print " Modified $count_modified files.\n";
print " Huffman table optimizations: $count_optimize\n";
print " Progressive JPEG optimizations: $count_progressive\n";
print " Total bytes saved: $bytes_saved (orig $bytes_orig, saved "
. (int($bytes_saved/$bytes_orig*10000) / 100) . "%)\n";
print "\n";
sub jpegCompress()
{
if (m/\.jpg$/i) {
$count_jpegs++;
my $orig_size = -s $_;
my $saved = 0;
my $fullname = $File::Find::dir . '/' . $_;
print "Inspecting $fullname\n";
# Run Progressive JPEG and Huffman table optimizations, then inspect
# which was best.
`/usr/bin/jpegtran -copy none -optimize $_ > $_.opt`;
my $opt_size = -s "$_.opt";
`/usr/bin/jpegtran -copy none -progressive $_ > $_.prog`;
my $prog_size = -s "$_.prog";
if ($opt_size && $opt_size < $orig_size && $opt_size <= $prog_size) {
move("$_.opt", "$_");
$saved = $orig_size - $opt_size;
$bytes_saved += $saved;
$bytes_orig += $orig_size;
$count_modified++;
$count_optimize++;
print " -- Huffman table optimization: "
. "saved $saved bytes (orig $orig_size)\n";
} elsif ($prog_size && $prog_size < $orig_size) {
move("$_.prog", "$_");
$saved = $orig_size - $prog_size;
$bytes_saved += $saved;
$bytes_orig += $orig_size;
$count_modified++;
$count_progressive++;
print " -- Progressive JPEG optimization: "
. "saved $saved bytes (orig $orig_size)\n";
}
# Cleanup temp files
if (-e "$_.prog") {
unlink("$_.prog");
}
if (-e "$_.opt") {
unlink("$_.opt");
}
}
}