Skip to content

Commit c0143d8

Browse files
author
Alex Tharp
authored
Merge pull request #63 from cortex-cms/topic/COR-807-Optimize-Images
COR-807: Optimize Images
2 parents fc23afd + 7a278a2 commit c0143d8

File tree

5 files changed

+76
-17
lines changed

5 files changed

+76
-17
lines changed

app/cells/plugins/core/asset_info/show.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
- if asset_is_image?
99
.mdl-card__title
1010
%h2.mdl-card__title-text
11-
= image_tag(asset['versions']['original']['url'], style: 'max-height: 200px;')
11+
= image_tag(asset['versions']['original']['url'], style: 'min-height: 50px; max-height: 200px;')
1212
.mdl-card__supporting-text
1313
%dl
1414
%dt Original Filename

app/uploaders/asset_uploader.rb

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
require 'image_processing/mini_magick'
2+
require 'image_optim'
23

34
class AssetUploader < Shrine
45
include ImageProcessing::MiniMagick
6+
include Imageable
57

68
plugin :determine_mime_type
79
plugin :store_dimensions
@@ -25,14 +27,15 @@ class AssetUploader < Shrine
2527
end
2628

2729
process(:store) do |io, context|
28-
# TODO: Perform image optimizations (build plugin), support versions without processors or formatters
30+
# TODO: support versions without processors
2931
context[:generated_hex] = SecureRandom.hex(8)
3032
versions = { original: io.download }
3133

3234
if image?(io)
35+
image_optim = image_optim_for(context[:config][:metadata][:image_optim_config])
3336
versions.merge!(context[:config][:metadata][:versions].transform_values do |version|
3437
processed_version = send("#{version[:process][:method]}!", io.download, *version[:process][:config].values)
35-
convert!(processed_version, version[:format])
38+
optimize_image!(processed_version, image_optim) # TODO: per-version image_optim_config
3639
end)
3740
end
3841

@@ -48,8 +51,4 @@ def generate_location(io, context)
4851

4952
ERB.new(context[:config][:metadata][:path]).result(binding)
5053
end
51-
52-
def image?(io)
53-
MimeMagic.new(io.data['metadata']['mime_type']).mediatype == 'image'
54-
end
5554
end

app/uploaders/concerns/imageable.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module Imageable
2+
extend ActiveSupport::Concern
3+
4+
included do
5+
def image?(io)
6+
MimeMagic.new(io.data['metadata']['mime_type']).mediatype == 'image'
7+
end
8+
9+
def optimize_image!(image, image_optim)
10+
pathname = image_optim.optimize_image!(image) # TODO: move to ActiveJob
11+
pathname ? pathname.open : image
12+
end
13+
14+
def image_optim_for(image_optim_config)
15+
ImageOptim.new(process_image_optim_config(image_optim_config))
16+
end
17+
18+
def process_image_optim_config(image_optim_config)
19+
processed_image_optim_config = image_optim_config.merge(pngout: false, svgo: false, verbose: true, skip_missing_workers: false)
20+
processed_image_optim_config.extend(Hashie::Extensions::DeepLocate)
21+
quality_range_hashes = processed_image_optim_config.deep_locate -> (key, value, object) { key == :quality_range }
22+
quality_range_hashes.each do |quality_range_hash|
23+
quality_range_hash[:quality] = quality_range_hash[:quality_range][:begin]..quality_range_hash[:quality_range][:end]
24+
quality_range_hash.delete(:quality_range)
25+
end
26+
27+
processed_image_optim_config
28+
end
29+
end
30+
end

cortex-plugins-core.gemspec

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ Gem::Specification.new do |s|
2121
s.add_dependency "cells", "~> 4.1"
2222
s.add_dependency "cells-rails", "~> 0.0"
2323
s.add_dependency "cells-haml", "~> 0.0"
24-
s.add_dependency "jsonb_accessor", "~> 1.0.0.beta"
24+
s.add_dependency "jsonb_accessor", "~> 1.0"
2525

2626
# AssetFieldType
27-
s.add_dependency "shrine", "~> 2.6"
27+
s.add_dependency "shrine", "~> 2.7"
2828
s.add_dependency "mimemagic", "~> 0.3"
2929
s.add_dependency "image_processing", "~> 0.4"
30-
s.add_dependency "mini_magick", "~> 4.7"
30+
s.add_dependency "mini_magick", "~> 4.8"
3131
s.add_dependency "fastimage", "~> 2.1"
32+
s.add_dependency "image_optim", "~> 0.25"
33+
s.add_dependency "image_optim_pack", "~> 0.5"
3234
end

lib/tasks/cortex/core/media.rake

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ namespace :cortex do
3232
naming_data: {
3333
title: fieldTitle.id
3434
},
35-
versions: {
36-
large: { process: { method: 'resize_to_limit', config: { width: '1800', height: '1800' } }, format: :jpg },
37-
medium: { process: { method: 'resize_to_limit', config: { width: '800', height: '800' } }, format: :jpg },
38-
default: { process: { method: 'resize_to_limit', config: { width: '300', height: '300' } }, format: :jpg },
39-
mini: { process: { method: 'resize_to_limit', config: { width: '100', height: '100' } }, format: :jpg },
40-
micro: { process: { method: 'resize_to_limit', config: { width: '50', height: '50' } }, format: :jpg },
35+
versions: { # Move to YAML
36+
large: { process: { method: 'resize_to_limit', config: { width: '1800', height: '1800' } } },
37+
medium: { process: { method: 'resize_to_limit', config: { width: '800', height: '800' } } },
38+
default: { process: { method: 'resize_to_limit', config: { width: '300', height: '300' } } },
39+
mini: { process: { method: 'resize_to_limit', config: { width: '100', height: '100' } } },
40+
micro: { process: { method: 'resize_to_limit', config: { width: '50', height: '50' } } },
41+
rss: { process: { method: 'resize_to_limit', config: { width: '840', height: '840' } } },
4142
},
4243
keep_files: [:destroyed, :replaced],
4344
path: 'media/<%= attachment %>/<%= original_name %>-<%= style %>-<%= generated_hex %>.<%= extension %>',
44-
storage: {
45+
storage: { # Move to YAML
4546
type: 's3',
4647
host_alias: ENV['HOST_ALIAS'],
4748
config: {
@@ -54,6 +55,33 @@ namespace :cortex do
5455
cache_control: 'public, max-age=315576000'
5556
}
5657
}
58+
},
59+
image_optim_config: { # Move to YAML
60+
allow_lossy: true,
61+
jpegoptim: {
62+
allow_lossy: true,
63+
strip: 'all',
64+
max_quality: 60
65+
},
66+
pngquant: {
67+
allow_lossy: true,
68+
quality_range: {
69+
begin: 33,
70+
end: 50
71+
},
72+
speed: 3
73+
},
74+
gifsicle: {
75+
interlace: true
76+
},
77+
advpng: false,
78+
jhead: false,
79+
jpegrecompress: false,
80+
jpegtran: false,
81+
optipng: false,
82+
pngcrush: false,
83+
pngout: false,
84+
svgo: false
5785
}
5886
})
5987
media.fields.new(name: 'Description', field_type: 'text_field_type', validations: {presence: true})

0 commit comments

Comments
 (0)