Module: SafeImage::Optimizer

Defined in:
lib/safe_image/optimizer.rb

Constant Summary collapse

MAX_PNGQUANT_SIZE =

pngquant’s lossy trial is worthwhile only for small generated PNGs; above this size the extra decode/quantize pass is comparatively expensive. The lossless PNG optimizer still runs for larger PNGs.

500_000
JPEGTRAN_OPERATIONS =

EXIF orientation values mapped onto jpegtran’s lossless transforms.

{
  2 => %w[-flip horizontal],
  3 => %w[-rotate 180],
  4 => %w[-flip vertical],
  5 => ["-transpose"],
  6 => %w[-rotate 90],
  7 => ["-transverse"],
  8 => %w[-rotate 270]
}.freeze

Class Method Summary collapse

Class Method Details

.jpegtran_perfect_reject?(error) ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
28
# File 'lib/safe_image/optimizer.rb', line 25

def jpegtran_perfect_reject?(error)
  error.is_a?(CommandError) && error.category == :exit_status && error.status.to_i == 1 &&
    Array(error.command).include?("-perfect")
end

.optimize(input:, output:, mode: :lossless, strip_metadata: true, quality: nil, timeout: Runner::DEFAULT_TIMEOUT, strict: true, assume_upright: false) ⇒ Object

assume_upright: skips the JPEG orientation check; only for callers optimising output this gem just encoded (which is always upright).



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
# File 'lib/safe_image/optimizer.rb', line 32

def optimize(
  input:,
  output:,
  mode: :lossless,
  strip_metadata: true,
  quality: nil,
  timeout: Runner::DEFAULT_TIMEOUT,
  strict: true,
  assume_upright: false
)
  input, output = PathSafety.ensure_distinct_file_paths!(input, output)
  ext = normalized_extension(input)

  StagedOutput.replace(output, suffix: ".safe-image.#{ext}") do |tmp_path|
    FileUtils.cp(input, tmp_path)
    optimize_working_file!(
      tmp_path,
      mode: mode,
      strip_metadata: ,
      quality: quality,
      timeout: timeout,
      strict: strict,
      assume_upright: assume_upright
    )
  end
end