sobakasu-image_science 1.1.5 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/image_science +13 -1
- data/ext/image_science_ext.c.in +68 -0
- data/lib/image_science.rb +32 -1
- data/spec/image_science_spec.rb +29 -1
- metadata +3 -3
data/bin/image_science
CHANGED
@@ -48,6 +48,12 @@
|
|
48
48
|
# * flip_vertical
|
49
49
|
# * flip_horizontal
|
50
50
|
# * rotate <angle> [<x_shift> <y_shift> <x_origin> <y_origin> <use_mask>]
|
51
|
+
# * dpi
|
52
|
+
# * dpi_x
|
53
|
+
# * dpi_y
|
54
|
+
# * dpm_x
|
55
|
+
# * dpm_y
|
56
|
+
# * resize_with_dpm <width> <height> <dpm_x> <dpm_y>
|
51
57
|
#
|
52
58
|
# Refer to the ImageScience documentation for allowed value ranges.
|
53
59
|
#
|
@@ -68,8 +74,9 @@
|
|
68
74
|
# # display effects of gamma adjustments on pixel color (writes to 'output'):
|
69
75
|
# > image_science get_pixel_color 0 0 pix.jpg | image_science adjust_gamma 0.5 | image_science get_pixel_color 0 0
|
70
76
|
|
77
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
71
78
|
require 'rubygems'
|
72
|
-
require
|
79
|
+
require 'image_science'
|
73
80
|
require 'getoptlong'
|
74
81
|
|
75
82
|
ARG_SPEC = [ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
@@ -210,6 +217,11 @@ EOM
|
|
210
217
|
when 'crop'
|
211
218
|
l, r, t, b = expect_params(%W{<left> <top> <right> <bottom>})
|
212
219
|
process_data(opts) { |i| i.crop(l, r, t, b); @changed = true }
|
220
|
+
when 'dpi_x', 'dpi_y', 'dpm_x', 'dpm_y', 'dpi'
|
221
|
+
process_data(opts) { |i| warn i.send(@command) }
|
222
|
+
when 'resize_with_dpm'
|
223
|
+
w, h, x, y = expect_params(%W{<width> <height> <dpm_x> <dpm_y>})
|
224
|
+
process_data(opts) { |i| i.resize_with_dpm(w, h, x, y); @changed = true }
|
213
225
|
when 'rotate'
|
214
226
|
a, *args = expect_params("<angle>", %W{<x_shift> <y_shift> <x_origin>
|
215
227
|
<y_origin> <use_mask>})
|
data/ext/image_science_ext.c.in
CHANGED
@@ -719,6 +719,71 @@ static VALUE rotate(int argc, VALUE *argv, VALUE self) {
|
|
719
719
|
}
|
720
720
|
}
|
721
721
|
|
722
|
+
// dpi methods from tcaddy
|
723
|
+
|
724
|
+
/*
|
725
|
+
* Returns to dots-per-meter of x-axis (width) of image
|
726
|
+
*/
|
727
|
+
static VALUE dpm_x(VALUE self) {
|
728
|
+
FIBITMAP *bitmap;
|
729
|
+
GET_BITMAP(bitmap);
|
730
|
+
|
731
|
+
int dpm_x = FreeImage_GetDotsPerMeterX(bitmap);
|
732
|
+
return INT2FIX(FreeImage_GetDotsPerMeterX(bitmap));
|
733
|
+
}
|
734
|
+
|
735
|
+
/*
|
736
|
+
* Returns to dots-per-meter of y-axis (height) of image
|
737
|
+
*/
|
738
|
+
static VALUE dpm_y(VALUE self) {
|
739
|
+
FIBITMAP *bitmap;
|
740
|
+
GET_BITMAP(bitmap);
|
741
|
+
|
742
|
+
return INT2FIX(FreeImage_GetDotsPerMeterY(bitmap));
|
743
|
+
}
|
744
|
+
|
745
|
+
/*
|
746
|
+
* call-seq:
|
747
|
+
* resize_with_dpm(width, height, dpm_x, dpm_y)
|
748
|
+
*
|
749
|
+
* Resizes the image to +width+ and +height+ using a cubic-bspline
|
750
|
+
* filter, and converts to Dots-per-Meter.
|
751
|
+
* If a block is given, yields the new image, else returns
|
752
|
+
* true on success.
|
753
|
+
*/
|
754
|
+
static VALUE resize_with_dpm(VALUE self, VALUE wv, VALUE hv, VALUE dpm_xv, VALUE dpm_yv) {
|
755
|
+
int w, h, dpm_x, dpm_y;
|
756
|
+
FIBITMAP *bitmap, *image;
|
757
|
+
FREE_IMAGE_FORMAT fif;
|
758
|
+
|
759
|
+
w = FIX2INT(wv);
|
760
|
+
h = FIX2INT(hv);
|
761
|
+
dpm_x = FIX2INT(dpm_xv);
|
762
|
+
dpm_y = FIX2INT(dpm_yv);
|
763
|
+
|
764
|
+
if (w <= 0) rb_raise(rb_eArgError, "Width <= 0");
|
765
|
+
if (h <= 0) rb_raise(rb_eArgError, "Height <= 0");
|
766
|
+
if (dpm_x <= 0) rb_raise(rb_eArgError, "Dots-per-Meter X-Axis <= 0");
|
767
|
+
if (dpm_y <= 0) rb_raise(rb_eArgError, "Dots-per-Meter Y-Axis <= 0");
|
768
|
+
|
769
|
+
GET_BITMAP(bitmap);
|
770
|
+
fif = get_fif(self);
|
771
|
+
image = FreeImage_Rescale(bitmap, w, h, FILTER_CATMULLROM);
|
772
|
+
FreeImage_SetDotsPerMeterX(image, dpm_x);
|
773
|
+
FreeImage_SetDotsPerMeterY(image, dpm_y);
|
774
|
+
if (image) {
|
775
|
+
copy_icc_profile(bitmap, image, fif);
|
776
|
+
|
777
|
+
if(rb_block_given_p()) {
|
778
|
+
return wrap_and_yield(image, self, 0);
|
779
|
+
} else {
|
780
|
+
FreeImage_Unload(bitmap);
|
781
|
+
DATA_PTR(self) = image;
|
782
|
+
}
|
783
|
+
}
|
784
|
+
return image ? Qtrue : Qfalse;
|
785
|
+
}
|
786
|
+
|
722
787
|
/*
|
723
788
|
* call-seq:
|
724
789
|
* ImageScience.new(filename, flags = 0)
|
@@ -778,6 +843,9 @@ void Init_image_science_ext(void)
|
|
778
843
|
rb_define_method(isc, "flip_horizontal", flip_horizontal, 0);
|
779
844
|
rb_define_method(isc, "flip_vertical", flip_vertical, 0);
|
780
845
|
rb_define_method(isc, "rotate", rotate, -1);
|
846
|
+
rb_define_method(isc, "dpm_x", dpm_x, 0);
|
847
|
+
rb_define_method(isc, "dpm_y", dpm_x, 0);
|
848
|
+
rb_define_method(isc, "resize_with_dpm", resize_with_dpm, 4);
|
781
849
|
|
782
850
|
/* FREE_IMAGE_TYPE constants */
|
783
851
|
isc_image_types = rb_define_module_under(isc, "ImageTypes");
|
data/lib/image_science.rb
CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../ext/image_science_ext'
|
|
2
2
|
|
3
3
|
class ImageScience
|
4
4
|
|
5
|
-
VERSION = "1.1.
|
5
|
+
VERSION = "1.1.6"
|
6
6
|
|
7
7
|
##
|
8
8
|
# Returns the type of the image as a string.
|
@@ -145,6 +145,37 @@ class ImageScience
|
|
145
145
|
set_pixel_color(x, y, *args)
|
146
146
|
end
|
147
147
|
|
148
|
+
# methods from tcaddy (https://github.com/tcaddy/image_science) :nodoc:
|
149
|
+
|
150
|
+
# Convert a number from dots-per-meter to dots-per-inch
|
151
|
+
def self.dpm_to_dpi(dpm)
|
152
|
+
(dpm.to_f * (1.to_f/100.to_f) * ((2.54).to_f/1.to_f)).to_f
|
153
|
+
end
|
154
|
+
|
155
|
+
##
|
156
|
+
# Convert a number from dots-per-inch to dots-per-meter
|
157
|
+
def self.dpi_to_dpm(dpi)
|
158
|
+
(dpi.to_f * (1.to_f/(2.54).to_f) * (100.to_f/1.to_f)).to_f
|
159
|
+
end
|
160
|
+
|
161
|
+
##
|
162
|
+
# Returns the DPI of x-axis (width) of the image, in dots-per-inch as float
|
163
|
+
def dpi_x
|
164
|
+
self.class.dpm_to_dpi(dpm_x)
|
165
|
+
end
|
166
|
+
|
167
|
+
##
|
168
|
+
# Returns the DPI of y-axis (height) of the image, in dots-per-inch as float
|
169
|
+
def dpi_y
|
170
|
+
self.class.dpm_to_dpi(dpm_y)
|
171
|
+
end
|
172
|
+
|
173
|
+
##
|
174
|
+
# Returns the DPI of image, as hash of float values
|
175
|
+
def dpi
|
176
|
+
{:x=>dpi_x,:y=>dpi_y}
|
177
|
+
end
|
178
|
+
|
148
179
|
private
|
149
180
|
|
150
181
|
def self.fif_to_string(fif)
|
data/spec/image_science_spec.rb
CHANGED
@@ -245,7 +245,7 @@ describe ImageScience do
|
|
245
245
|
|
246
246
|
describe "get_pixel_color" do
|
247
247
|
expected = {
|
248
|
-
:jpg => [[62, 134, 122, 0], [0,
|
248
|
+
:jpg => [[62, 134, 122, 0], [0, 11, 6, 0]],
|
249
249
|
:png => [[62, 134, 121, 0], [1, 2, 2, 0]],
|
250
250
|
:gif => [[59, 135, 119, 0], [0, 2, 0, 0]],
|
251
251
|
:bmp => [[62, 134, 121, 0], [1, 2, 2, 0]],
|
@@ -512,6 +512,34 @@ describe ImageScience do
|
|
512
512
|
end
|
513
513
|
end
|
514
514
|
|
515
|
+
# dpi methods (from tcaddy)
|
516
|
+
|
517
|
+
describe "dpm_x" do
|
518
|
+
it "should return the dpm on the x axis" do
|
519
|
+
ImageScience.with_image image_path(ext) do |img|
|
520
|
+
img.dpi_x.should == 72.009
|
521
|
+
end
|
522
|
+
end
|
523
|
+
end
|
524
|
+
|
525
|
+
describe "dpm_y" do
|
526
|
+
it "should return the dpm on the y axis" do
|
527
|
+
ImageScience.with_image image_path(ext) do |img|
|
528
|
+
img.dpi_y.should == 72.009
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
describe "resize_with_dpm" do
|
534
|
+
it "should resize the image to the specified dpm" do
|
535
|
+
ImageScience.with_image image_path(ext) do |img|
|
536
|
+
img.resize_with_dpm(30, 30, 100, 100).should be_true
|
537
|
+
img.dpm_x.should == 100
|
538
|
+
img.dpm_y.should == 100
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
515
543
|
end
|
516
544
|
end
|
517
545
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 6
|
9
|
+
version: 1.1.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ryan Davis
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-10 00:00:00 +10:30
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|