From e0dbd48b3c7c046ccbe35cda909f83969eb0cd43 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Thu, 15 Oct 2015 15:02:35 +0100 Subject: [PATCH] add load magick from buffer try: irb(main):007:0> png_data = IO.read "k2.png" irb(main):007:0> require 'vips' irb(main):007:0> reader = VIPS::MagickReader.new png_data irb(main):007:0> im = reader.read_buffer irb(main):007:0> im.x_size => 1450 see: https://github.com/jcupitt/ruby-vips/issues/69 --- CHANGELOG.md | 4 ++++ Gemfile.lock | 2 +- ext/reader.c | 26 ++++++++++++++++++++++++++ lib/vips/reader.rb | 6 ++++++ lib/vips/version.rb | 2 +- spec/vips/magick_reader_spec.rb | 9 +++++++++ 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f219929..6e9fbcde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # master +# Version 0.3.11 + +* added magick load from buffer [John Cupitt] + # Version 0.3.10 * added webp write [John Cupitt] diff --git a/Gemfile.lock b/Gemfile.lock index 645bccf7..e215bd4d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,6 @@ GEM remote: http://rubygems.org/ specs: - rake (10.4.2) addressable (2.3.8) builder (3.2.2) diff-lcs (1.2.5) @@ -39,6 +38,7 @@ GEM multi_xml (~> 0.5) rack (~> 1.2) rack (1.6.4) + rake (10.4.2) rdoc (4.2.0) json (~> 1.4) rdoc-data (4.0.1) diff --git a/ext/reader.c b/ext/reader.c index 424e9fda..96e5e824 100644 --- a/ext/reader.c +++ b/ext/reader.c @@ -73,6 +73,28 @@ jpeg_buf_internal(VALUE obj, VALUE buf, VALUE shrink, VALUE fail) return img_init(cVIPSImage, im_new); } +static VALUE +magick_buf_internal(VALUE obj, VALUE buf) +{ + VipsImage *im_new; + + im_new = NULL; + +#if ATLEAST_VIPS( 8, 2 ) + buf = StringValue(buf); + + if (!(im_new = im_open("", "p"))) + vips_lib_error(); + + if (im_bufmagick2vips(RSTRING_PTR(buf), RSTRING_LEN(buf), im_new, FALSE)) + vips_lib_error(); +#else + rb_raise(eVIPSError, "This method is not implemented in your version of VIPS"); +#endif + + return img_init(cVIPSImage, im_new); +} + static VALUE png_buf_internal(VALUE obj, VALUE buf) { @@ -214,6 +236,10 @@ init_Reader(void) rb_define_private_method(magick_reader, "read_internal", magick_read_internal, 2); reader_fmt_set(magick_reader, "magick"); + magick_reader = rb_define_class_under(mVIPS, "MagickReader", reader); + rb_define_private_method(magick_reader, "buf_internal", magick_buf_internal, 1); + reader_fmt_set(magick_reader, "magick"); + /* * Read Analyze images. */ diff --git a/lib/vips/reader.rb b/lib/vips/reader.rb index 23fa4505..eba7ae0b 100644 --- a/lib/vips/reader.rb +++ b/lib/vips/reader.rb @@ -214,6 +214,12 @@ def read_buffer end end + class MagickReader < Reader + def read_buffer + @_im = buf_internal @path + end + end + class Image # Load a ppm file straight to a VIPS Image. diff --git a/lib/vips/version.rb b/lib/vips/version.rb index 34969d81..0c3fbb9a 100644 --- a/lib/vips/version.rb +++ b/lib/vips/version.rb @@ -1,3 +1,3 @@ module VIPS - VERSION = "0.3.10" + VERSION = "0.3.11" end diff --git a/spec/vips/magick_reader_spec.rb b/spec/vips/magick_reader_spec.rb index b29d564b..e579d789 100644 --- a/spec/vips/magick_reader_spec.rb +++ b/spec/vips/magick_reader_spec.rb @@ -14,4 +14,13 @@ res = VIPS::MagickReader.recognized? @path res.should == true end + + it "should read a magick file from memory" do + if Spec::Helpers.match_vips_version(">= 8.2") + png_data = IO.read(@path) + reader = VIPS::MagickReader.new(png_data) + im = reader.read_buffer + im.x_size.should == @image.x_size + end + end end