X-Git-Url: https://projects.mako.cc/source/selectricity/blobdiff_plain/6a935d078f20d2b1b0d60f0a30c41a642d40758a..5e74f498cd2f8d765e309ca52a45a7c2db0a1a6f:/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb diff --git a/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb b/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb new file mode 100644 index 0000000..095283c --- /dev/null +++ b/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb @@ -0,0 +1,61 @@ +require 'image_science' +module Technoweenie # :nodoc: + module AttachmentFu # :nodoc: + module Processors + module ImageScienceProcessor + def self.included(base) + base.send :extend, ClassMethods + base.alias_method_chain :process_attachment, :processing + end + + module ClassMethods + # Yields a block containing an RMagick Image for the given binary data. + def with_image(file, &block) + ::ImageScience.with_image file, &block + end + end + + protected + def process_attachment_with_processing + return unless process_attachment_without_processing && image? + with_image do |img| + self.width = img.width if respond_to?(:width) + self.height = img.height if respond_to?(:height) + resize_image_or_thumbnail! img + end + end + + # Performs the actual resizing operation for a thumbnail + def resize_image(img, size) + # create a dummy temp file to write to + # ImageScience doesn't handle all gifs properly, so it converts them to + # pngs for thumbnails. It has something to do with trying to save gifs + # with a larger palette than 256 colors, which is all the gif format + # supports. + filename.sub! /gif$/, 'png' + content_type.sub!(/gif$/, 'png') + self.temp_path = write_to_temp_file(filename) + grab_dimensions = lambda do |img| + self.width = img.width if respond_to?(:width) + self.height = img.height if respond_to?(:height) + img.save self.temp_path + self.size = File.size(self.temp_path) + callback_with_args :after_resize, img + end + + size = size.first if size.is_a?(Array) && size.length == 1 + if size.is_a?(Fixnum) || (size.is_a?(Array) && size.first.is_a?(Fixnum)) + if size.is_a?(Fixnum) + img.thumbnail(size, &grab_dimensions) + else + img.resize(size[0], size[1], &grab_dimensions) + end + else + new_size = [img.width, img.height] / size.to_s + img.resize(new_size[0], new_size[1], &grab_dimensions) + end + end + end + end + end +end \ No newline at end of file