From a526c0ef09bc34fd91079c511edabb6a1a817487 Mon Sep 17 00:00:00 2001 From: Dominik Szromik Date: Tue, 8 Oct 2019 12:42:20 +0200 Subject: [PATCH] Fix image filetype recognition filetype method does not work for all kinds of images. data.unpack('n')[0] == 0xFFD8 passes but then image does not have JFIF/Exif info in @data so filetype is nil resulting a crash beacause width and height cannot be set (image is not processed at all). The solution is to use mimemagick for image type recognition. Added republic_ps.jpg image that was generated by latest Photoshop CC with default settings Added test for image import process @dodo121 --- lib/writeexcel/image.rb | 14 ++++---------- test/helper.rb | 2 +- test/republic_ps.jpg | Bin 0 -> 24972 bytes test/test_image.rb | 18 ++++++++++++++++++ writeexcel.gemspec | 1 + 5 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 test/republic_ps.jpg create mode 100644 test/test_image.rb diff --git a/lib/writeexcel/image.rb b/lib/writeexcel/image.rb index f138ef89..34563377 100644 --- a/lib/writeexcel/image.rb +++ b/lib/writeexcel/image.rb @@ -59,11 +59,11 @@ def store_image_record(i, num_images, num_charts, num_filters, num_comments, spi # Process the image and extract dimensions. def process case filetype - when 'PNG' + when 'png' process_png(@data) - when 'JPG' + when 'jpg', 'jpeg' process_jpg(@data) - when 'BMP' + when 'bmp' process_bmp(@data) # The 14 byte header of the BMP is stripped off. @data[0, 13] = '' @@ -75,13 +75,7 @@ def process end def filetype - return 'PNG' if @data.unpack('x A3')[0] == 'PNG' - return 'BMP' if @data.unpack('A2')[0] == 'BM' - if data.unpack('n')[0] == 0xFFD8 - return 'JPG' if @data.unpack('x6 A4')[0] == 'JFIF' || @data.unpack('x6 A4')[0] == 'Exif' - else - raise "Unsupported image format for file: #{@filename}\n" - end + MimeMagic.by_magic(@data).subtype end # Extract width and height information from a PNG file. diff --git a/test/helper.rb b/test/helper.rb index 85ba04cc..ce2059c6 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # require 'simplecov' require 'test/unit' - +require 'mimemagic' # SimpleCov.start $LOAD_PATH.unshift(File.dirname(__FILE__)) diff --git a/test/republic_ps.jpg b/test/republic_ps.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1e106fe3f3542e4cfdddc6eaef1a8cfb86dceb6 GIT binary patch literal 24972 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 literal 0 HcmV?d00001 diff --git a/test/test_image.rb b/test/test_image.rb new file mode 100644 index 00000000..3498815d --- /dev/null +++ b/test/test_image.rb @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +require 'helper' + +class TestImage < Test::Unit::TestCase + def setup + @test_file = StringIO.new + @workbook = WriteExcel.new(@test_file) + @worksheet = @workbook.add_worksheet('test', 0) + end + + def test_import_image_is_created_by_adobe_photoshop + image = Writeexcel::Image.new(@worksheet, 0, 0, "test/republic_ps.jpg") + image.import + assert_equal(image.height, 120) + assert_equal(image.width, 120) + assert_equal(image.size, 24972) + end +end diff --git a/writeexcel.gemspec b/writeexcel.gemspec index f2348c89..ad97b65f 100644 --- a/writeexcel.gemspec +++ b/writeexcel.gemspec @@ -24,4 +24,5 @@ Gem::Specification.new do |gem| "README.rdoc" ] gem.add_development_dependency 'simplecov' + gem.add_development_dependency 'mimemagic' end