tifffile 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gemspec +2 -2
- data/.idea/.rakeTasks +1 -1
- data/analyzer.py +1 -1
- data/lib/tags.rb +103 -0
- data/lib/tifffile.rb +60 -14
- data/lib/tifffile/version.rb +1 -1
- data/spec/tifffile_spec.rb +38 -2
- metadata +6 -9
- data/.idea/encodings.xml +0 -6
- data/.idea/misc.xml +0 -14
- data/.idea/modules.xml +0 -8
- data/.idea/tifffile-ruby.iml +0 -20
- data/ext/tifffile/extconf.rb +0 -62
- data/ext/tifffile/tifffile.cpp +0 -237
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cba8faec8b96beb253d6d78be95612d7b75a93f0
|
4
|
+
data.tar.gz: 1206e7af1c3771ec3871197a9e4e426dffc6a617
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 876651d883fbf0bbbb4edffacc5ee436cbb903d5c78d34413693fad7ef72a0eaf3cca6de1d7e083c692b364d935f423fb13ad960f0b04a82b9e5f1b40028655a
|
7
|
+
data.tar.gz: ec2b257624f8cffae6e4c5bc84bf930c82ca920494579419c672b4a8923c42f7dd805f458ad09f6f35c524b05550d456b43df50ec600633ae5049b4d17b6033c
|
data/.gemspec
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path("../lib/tifffile/version", __FILE__)
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = 'tifffile'
|
5
5
|
gem.version = TiffFileVersion::VERSION
|
6
|
-
gem.date = '2016-03-
|
6
|
+
gem.date = '2016-03-21'
|
7
7
|
|
8
8
|
gem.summary = "TIFF reader and writer"
|
9
9
|
gem.description = ""
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.homepage = 'https://github.com/kirillmakhonin/tifffile-ruby'
|
16
16
|
|
17
17
|
|
18
|
-
gem.files = `git ls-files`.split($\)
|
18
|
+
gem.files = `git ls-files`.split($\) + Dir.glob("lib/**/*") - Dir.glob("ext/**/*") - Dir.glob(".idea/**/*")
|
19
19
|
|
20
20
|
|
21
21
|
end
|
data/.idea/.rakeTasks
CHANGED
@@ -4,4 +4,4 @@ You are allowed to:
|
|
4
4
|
1. Remove rake task
|
5
5
|
2. Add existing rake tasks
|
6
6
|
To add existing rake tasks automatically delete this file and reload the project.
|
7
|
-
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Compile all the extensions" fullCmd="compile" taksId="compile" /><RakeGroup description="" fullCmd="" taksId="compile"><RakeTask description="Compile tifffile" fullCmd="compile:tifffile" taksId="tifffile" /><RakeGroup description="" fullCmd="" taksId="tifffile"><RakeTask description="" fullCmd="compile:tifffile:x86_64-linux" taksId="x86_64-linux" /></RakeGroup><RakeTask description="" fullCmd="compile:x86_64-linux" taksId="x86_64-linux" /></RakeGroup><RakeGroup description="" fullCmd="" taksId="copy"><RakeGroup description="" fullCmd="" taksId="tifffile"><RakeGroup description="" fullCmd="" taksId="x86_64-linux"><RakeTask description="" fullCmd="copy:tifffile:x86_64-linux:2.2.3" taksId="2.2.3" /></RakeGroup></RakeGroup></RakeGroup><RakeTask description="" fullCmd="lib" taksId="lib" /><RakeTask description="" fullCmd="lib/tifffile" taksId="lib/tifffile" /><RakeTask description="" fullCmd="lib/tifffile/tifffile.so" taksId="lib/tifffile/tifffile.so" /><RakeTask description="" fullCmd="tmp" taksId="tmp" /><RakeTask description="" fullCmd="tmp/x86_64-linux" taksId="tmp/x86_64-linux" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage" taksId="tmp/x86_64-linux/stage" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage/lib" taksId="tmp/x86_64-linux/stage/lib" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage/lib/tifffile" taksId="tmp/x86_64-linux/stage/lib/tifffile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile" taksId="tmp/x86_64-linux/tifffile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3" taksId="tmp/x86_64-linux/tifffile/2.2.3" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3/Makefile" taksId="tmp/x86_64-linux/tifffile/2.2.3/Makefile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3/tifffile.so" taksId="tmp/x86_64-linux/tifffile/2.2.3/tifffile.so" /></RakeGroup></Settings>
|
7
|
+
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Compile all the extensions" fullCmd="compile" taksId="compile" /><RakeGroup description="" fullCmd="" taksId="compile"><RakeTask description="Compile tifffile" fullCmd="compile:tifffile" taksId="tifffile" /><RakeGroup description="" fullCmd="" taksId="tifffile"><RakeTask description="" fullCmd="compile:tifffile:x86_64-linux" taksId="x86_64-linux" /></RakeGroup><RakeTask description="" fullCmd="compile:x86_64-linux" taksId="x86_64-linux" /></RakeGroup><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeGroup description="" fullCmd="" taksId="copy"><RakeGroup description="" fullCmd="" taksId="tifffile"><RakeGroup description="" fullCmd="" taksId="x86_64-linux"><RakeTask description="" fullCmd="copy:tifffile:x86_64-linux:2.2.3" taksId="2.2.3" /></RakeGroup></RakeGroup></RakeGroup><RakeTask description="" fullCmd="lib" taksId="lib" /><RakeTask description="" fullCmd="lib/tifffile" taksId="lib/tifffile" /><RakeTask description="" fullCmd="lib/tifffile/tifffile.so" taksId="lib/tifffile/tifffile.so" /><RakeTask description="" fullCmd="tmp" taksId="tmp" /><RakeTask description="" fullCmd="tmp/x86_64-linux" taksId="tmp/x86_64-linux" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage" taksId="tmp/x86_64-linux/stage" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage/lib" taksId="tmp/x86_64-linux/stage/lib" /><RakeTask description="" fullCmd="tmp/x86_64-linux/stage/lib/tifffile" taksId="tmp/x86_64-linux/stage/lib/tifffile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile" taksId="tmp/x86_64-linux/tifffile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3" taksId="tmp/x86_64-linux/tifffile/2.2.3" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3/Makefile" taksId="tmp/x86_64-linux/tifffile/2.2.3/Makefile" /><RakeTask description="" fullCmd="tmp/x86_64-linux/tifffile/2.2.3/tifffile.so" taksId="tmp/x86_64-linux/tifffile/2.2.3/tifffile.so" /></RakeGroup></Settings>
|
data/analyzer.py
CHANGED
data/lib/tags.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
module TiffFileTags
|
2
|
+
|
3
|
+
class Tag
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :id
|
6
|
+
attr_accessor :type
|
7
|
+
attr_accessor :map
|
8
|
+
|
9
|
+
# Creates a new tag.
|
10
|
+
|
11
|
+
# Examples:
|
12
|
+
#
|
13
|
+
# width = Tag.new(:width, 256, :uint)
|
14
|
+
# metric = Tag.new(:photometric, 262, :ushort, {
|
15
|
+
# min_is_white: 0,
|
16
|
+
# min_is_black: 1
|
17
|
+
# })
|
18
|
+
#
|
19
|
+
def initialize(name, id, type, map = nil)
|
20
|
+
@name = name
|
21
|
+
@id = id
|
22
|
+
@type = type
|
23
|
+
@map = map
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def tags
|
30
|
+
@@tags
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def tag(name)
|
35
|
+
key = name.to_s.to_sym
|
36
|
+
@@tags.has_key?(key) ? @@tags[key] : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
@@tags = Hash.new do |hash, key|
|
40
|
+
raise KeyError, "Tag #{key.inspect} is unsupported. Available tags: #{hash.keys}"
|
41
|
+
end
|
42
|
+
|
43
|
+
tags[:artist] = Tag.new(:artist, 315, :string)
|
44
|
+
tags[:bad_fax_lines] = Tag.new(:bad_fax_lines, 326, :uint)
|
45
|
+
tags[:bits_per_sample] = Tag.new(:bits_per_sample, 258, :ushort)
|
46
|
+
tags[:clean_fax_data] = Tag.new(:clean_fax_data, 327, :ushort)
|
47
|
+
tags[:compression] = Tag.new(:compression, 259, :ushort,
|
48
|
+
none: 1,
|
49
|
+
CCITTFAX3: 3,
|
50
|
+
CCITTFAX4: 4,
|
51
|
+
JPEG: 7
|
52
|
+
)
|
53
|
+
tags[:consecutive_bad_fax_lines] = Tag.new(:consecutive_bad_fax_lines, 328, :uint)
|
54
|
+
tags[:copyright] = Tag.new(:copyright, 33432, :string)
|
55
|
+
tags[:data_type] = Tag.new(:data_type, 32996, :ushort)
|
56
|
+
tags[:date_time] = Tag.new(:date_time, 306, :string)
|
57
|
+
tags[:document_name] = Tag.new(:document_name, 269, :string)
|
58
|
+
tags[:fill_order] = Tag.new(:fill_order, 266, :ushort)
|
59
|
+
tags[:group3_options] = Tag.new(:group3_options, 292, :uint)
|
60
|
+
tags[:group4_options] = Tag.new(:group4_options, 293, :uint)
|
61
|
+
tags[:height] = Tag.new(:height, 257, :uint)
|
62
|
+
tags[:host_computer] = Tag.new(:host_computer, 316, :string)
|
63
|
+
tags[:image_depth] = Tag.new(:image_depth, 32997, :uint)
|
64
|
+
tags[:image_description] = Tag.new(:image_description, 270, :string)
|
65
|
+
tags[:ink_names] = Tag.new(:ink_names, 333, :string)
|
66
|
+
tags[:ink_set] = Tag.new(:ink_set, 332, :ushort)
|
67
|
+
tags[:make] = Tag.new(:make, 271, :string)
|
68
|
+
tags[:matteing] = Tag.new(:matteing, 32995, :ushort)
|
69
|
+
tags[:max_sample_value] = Tag.new(:max_sample_value, 281, :ushort)
|
70
|
+
tags[:min_sample_value] = Tag.new(:min_sample_value, 280, :ushort)
|
71
|
+
tags[:model] = Tag.new(:model, 272, :string)
|
72
|
+
tags[:orientation] = Tag.new(:orientation, 274, :ushort)
|
73
|
+
tags[:page_name] = Tag.new(:page_name, 285, :string)
|
74
|
+
tags[:planar_config] = Tag.new(:page_name, 284, :ushort)
|
75
|
+
tags[:photometric] = Tag.new(:photometric, 262, :ushort,
|
76
|
+
min_is_white: 0,
|
77
|
+
min_is_black: 1,
|
78
|
+
rgb: 2,
|
79
|
+
palette: 3,
|
80
|
+
separated: 5
|
81
|
+
)
|
82
|
+
tags[:predictor] = Tag.new(:predictor, 317, :ushort)
|
83
|
+
tags[:resolution_unit] = Tag.new(:resolution_unit, 296, :ushort, none: 1, inch: 2, centimeter: 3)
|
84
|
+
tags[:rows_per_strip] = Tag.new(:rows_per_strip, 278, :uint)
|
85
|
+
tags[:s_max_sample_value] = Tag.new(:s_max_sample_value, 341, :double)
|
86
|
+
tags[:s_min_sample_value] = Tag.new(:s_min_sample_value, 340, :double)
|
87
|
+
tags[:sample_format] = Tag.new(:sample_format, 339, :ushort)
|
88
|
+
tags[:samples_per_pixel] = Tag.new(:samples_per_pixel, 277, :ushort)
|
89
|
+
tags[:software] = Tag.new(:software, 305, :string)
|
90
|
+
tags[:sub_file_type] = Tag.new(:sub_file_type, 255, :uint)
|
91
|
+
tags[:target_printer] = Tag.new(:target_printer, 337, :string)
|
92
|
+
tags[:tile_depth] = Tag.new(:tile_depth, 32998, :uint)
|
93
|
+
tags[:tile_length] = Tag.new(:tile_length, 323, :uint)
|
94
|
+
tags[:tile_width] = Tag.new(:tile_width, 322, :uint)
|
95
|
+
tags[:width] = Tag.new(:width, 256, :uint)
|
96
|
+
tags[:x_position] = Tag.new(:x_position, 286, :float)
|
97
|
+
tags[:x_resolution] = Tag.new(:x_resolution, 282, :float)
|
98
|
+
tags[:y_cb_cr_positioning] = Tag.new(:y_cb_cr_positioning, 531, :ushort)
|
99
|
+
tags[:y_position] = Tag.new(:y_position, 286, :float)
|
100
|
+
tags[:y_resolution] = Tag.new(:y_resolution, 283, :float)
|
101
|
+
|
102
|
+
|
103
|
+
end
|
data/lib/tifffile.rb
CHANGED
@@ -1,28 +1,74 @@
|
|
1
1
|
require 'tifffile/version'
|
2
2
|
require "tifffile/tifffile"
|
3
|
+
require "tags"
|
3
4
|
|
4
|
-
|
5
|
+
class TiffFile
|
5
6
|
|
6
7
|
include TiffFileVersion
|
8
|
+
include TiffFileTags
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
|
11
|
+
alias :valid? :is_valid?
|
12
|
+
alias :is_big_endian? :big_endian?
|
13
|
+
alias :sample_format :sample_format?
|
14
|
+
|
15
|
+
alias :unset_field :remove_field
|
16
|
+
|
17
|
+
alias :set :write_matrix
|
18
|
+
alias :get :read_matrix
|
19
|
+
|
20
|
+
alias :flush! :save
|
21
|
+
alias :save! :save
|
22
|
+
|
23
|
+
# Get field value
|
24
|
+
def get_field(fname)
|
25
|
+
field = tag fname
|
26
|
+
return nil if field.nil?
|
27
|
+
|
28
|
+
value = case field.type
|
29
|
+
when :string
|
30
|
+
get_string_field field.id
|
31
|
+
when :ushort
|
32
|
+
get_int_field field.id, 2
|
33
|
+
when :uint
|
34
|
+
get_int_field field.id, 4
|
35
|
+
when :double
|
36
|
+
get_float_field field.id, true
|
37
|
+
when :float
|
38
|
+
get_float_field field.id, true
|
39
|
+
else
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
return value if field.map.nil?
|
44
|
+
field.map.has_value?(value) ? field.map.key(value).to_sym : nil
|
12
45
|
end
|
13
46
|
|
47
|
+
# Set field value
|
48
|
+
def set_field(fname, fvalue)
|
49
|
+
field = tag fname
|
50
|
+
return nil if field.nil?
|
14
51
|
|
15
|
-
|
16
|
-
|
17
|
-
def self.tiff2binary(values, sample_size=16, description=nil, software=nil)
|
18
|
-
file = Tempfile.new('tiff2binary')
|
19
|
-
file.close
|
52
|
+
symkey = fname.to_s.to_sym
|
53
|
+
value = (field.map.nil? or not field.map.has_key?(symkey)) ? fvalue : field.map[symkey]
|
20
54
|
|
21
|
-
|
55
|
+
case field.type
|
56
|
+
when :string
|
57
|
+
set_string_field field.id, value.to_s
|
58
|
+
when :ushort
|
59
|
+
set_int_field field.id, value.to_i, 2
|
60
|
+
when :uint
|
61
|
+
set_int_field field.id, value.to_i, 4
|
62
|
+
when :double
|
63
|
+
set_float_field field.id, value.to_i, true
|
64
|
+
when :float
|
65
|
+
set_float_field field.id, value.to_i, true
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
22
69
|
|
23
|
-
data = File.read(file)
|
24
|
-
file.unlink
|
25
|
-
data
|
26
70
|
end
|
27
71
|
|
72
|
+
|
73
|
+
|
28
74
|
end
|
data/lib/tifffile/version.rb
CHANGED
data/spec/tifffile_spec.rb
CHANGED
@@ -1,7 +1,43 @@
|
|
1
1
|
require 'tifffile'
|
2
2
|
|
3
3
|
describe "TiffFile" do
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
File_Path = "file.tiff"
|
6
|
+
|
7
|
+
# it "building tiff file" do
|
8
|
+
# #TiffFile.tiff2file 'a.tiff', [[10, 20], [20, 30]]
|
9
|
+
#
|
10
|
+
# File.unlink(File_Path) if File.exist? File_Path
|
11
|
+
#
|
12
|
+
# t = TiffFile.new File_Path, "w"
|
13
|
+
# #p "Is big endian? = #{t.big_endian?.inspect}"
|
14
|
+
# #p "Inspect is a #{t.inspect}"
|
15
|
+
# #p "Methods is a #{t.methods}"
|
16
|
+
# m = [[10.23, 20.15], [30.60, 50.45]]
|
17
|
+
#
|
18
|
+
# #t.set_field :copyright, "COPYRIGHT"
|
19
|
+
# #puts "Copyyright #{t.get_field :copyright}"
|
20
|
+
# ans = t.write_matrix(m, 4, false)
|
21
|
+
# p ans.inspect
|
22
|
+
# end
|
23
|
+
|
24
|
+
it "reading tiff file" do
|
25
|
+
raise Exception.new("Cannot find file #{File_Path}") if not File.exist? File_Path
|
26
|
+
|
27
|
+
t = TiffFile.new File_Path, "r"
|
28
|
+
|
29
|
+
puts "Validation: #{t.is_valid?}"
|
30
|
+
|
31
|
+
puts "Width: #{t.get_int_field 256, 2}"
|
32
|
+
puts "FF Set: #{t.set_float_field 341, 5555.28, true}"
|
33
|
+
puts "FF Get: #{t.get_float_field 341, true}"
|
34
|
+
puts "FF Get unsetted: #{t.get_float_field 340, true}"
|
35
|
+
|
36
|
+
puts "Width is #{t.get_field :width}"
|
37
|
+
puts "Photometric is #{t.get_field :photometric}"
|
38
|
+
|
39
|
+
ans = t.read_matrix
|
40
|
+
|
41
|
+
puts ans.inspect
|
6
42
|
end
|
7
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tifffile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Makhonin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ''
|
14
14
|
email: kroks.rus@gmail.com
|
@@ -19,16 +19,12 @@ files:
|
|
19
19
|
- ".gemspec"
|
20
20
|
- ".gitignore"
|
21
21
|
- ".idea/.rakeTasks"
|
22
|
-
- ".idea/encodings.xml"
|
23
|
-
- ".idea/misc.xml"
|
24
|
-
- ".idea/modules.xml"
|
25
|
-
- ".idea/tifffile-ruby.iml"
|
26
22
|
- LICENSE
|
27
23
|
- Rakefile
|
28
24
|
- analyzer.py
|
29
|
-
-
|
30
|
-
- ext/tifffile/tifffile.cpp
|
25
|
+
- lib/tags.rb
|
31
26
|
- lib/tifffile.rb
|
27
|
+
- lib/tifffile/tifffile.so
|
32
28
|
- lib/tifffile/version.rb
|
33
29
|
- spec/tifffile_spec.rb
|
34
30
|
homepage: https://github.com/kirillmakhonin/tifffile-ruby
|
@@ -51,8 +47,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
47
|
version: '0'
|
52
48
|
requirements: []
|
53
49
|
rubyforge_project:
|
54
|
-
rubygems_version: 2.4.
|
50
|
+
rubygems_version: 2.4.8
|
55
51
|
signing_key:
|
56
52
|
specification_version: 4
|
57
53
|
summary: TIFF reader and writer
|
58
54
|
test_files: []
|
55
|
+
has_rdoc:
|
data/.idea/encodings.xml
DELETED
data/.idea/misc.xml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
4
|
-
<OptionsSetting value="true" id="Add" />
|
5
|
-
<OptionsSetting value="true" id="Remove" />
|
6
|
-
<OptionsSetting value="true" id="Checkout" />
|
7
|
-
<OptionsSetting value="true" id="Update" />
|
8
|
-
<OptionsSetting value="true" id="Status" />
|
9
|
-
<OptionsSetting value="true" id="Edit" />
|
10
|
-
<ConfirmationsSetting value="0" id="Add" />
|
11
|
-
<ConfirmationsSetting value="0" id="Remove" />
|
12
|
-
</component>
|
13
|
-
<component name="ProjectRootManager" version="2" project-jdk-name="RVM: ruby-2.2.3 [global]" project-jdk-type="RUBY_SDK" />
|
14
|
-
</project>
|
data/.idea/modules.xml
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ProjectModuleManager">
|
4
|
-
<modules>
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/tifffile-ruby.iml" filepath="$PROJECT_DIR$/.idea/tifffile-ruby.iml" />
|
6
|
-
</modules>
|
7
|
-
</component>
|
8
|
-
</project>
|
data/.idea/tifffile-ruby.iml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<module type="RUBY_MODULE" version="4">
|
3
|
-
<component name="FacetManager">
|
4
|
-
<facet type="gem" name="Ruby Gem">
|
5
|
-
<configuration>
|
6
|
-
<option name="GEM_APP_ROOT_PATH" value="$MODULE_DIR$" />
|
7
|
-
<option name="GEM_APP_TEST_PATH" value="" />
|
8
|
-
<option name="GEM_APP_LIB_PATH" value="$MODULE_DIR$/lib" />
|
9
|
-
</configuration>
|
10
|
-
</facet>
|
11
|
-
</component>
|
12
|
-
<component name="NewModuleRootManager">
|
13
|
-
<content url="file://$MODULE_DIR$">
|
14
|
-
<excludeFolder url="file://$MODULE_DIR$/.bundle" />
|
15
|
-
<excludeFolder url="file://$MODULE_DIR$/vendor/bundle" />
|
16
|
-
</content>
|
17
|
-
<orderEntry type="inheritedJdk" />
|
18
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
19
|
-
</component>
|
20
|
-
</module>
|
data/ext/tifffile/extconf.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
require "mkmf"
|
2
|
-
|
3
|
-
# Add C++ support
|
4
|
-
|
5
|
-
have_library( 'stdc++' );
|
6
|
-
$CFLAGS << " -Wall"
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
HEADER_DIRS = [
|
12
|
-
# First search /opt/local for macports
|
13
|
-
'/opt/local/include',
|
14
|
-
|
15
|
-
# Then search /usr/local for people that installed from source
|
16
|
-
'/usr/local/include',
|
17
|
-
|
18
|
-
# Check the ruby install locations
|
19
|
-
#INCLUDEDIR,
|
20
|
-
|
21
|
-
# Finally fall back to /usr
|
22
|
-
'/usr/include',
|
23
|
-
]
|
24
|
-
|
25
|
-
LIB_DIRS = [
|
26
|
-
# First search /opt/local for macports
|
27
|
-
'/opt/local/lib',
|
28
|
-
|
29
|
-
# Then search /usr/local for people that installed from source
|
30
|
-
'/usr/local/lib',
|
31
|
-
|
32
|
-
# Check the ruby install locations
|
33
|
-
#LIBDIR,
|
34
|
-
|
35
|
-
# Finally fall back to /usr
|
36
|
-
'/usr/lib',
|
37
|
-
]
|
38
|
-
|
39
|
-
|
40
|
-
libtiff_dirs = dir_config('libtiff', '/opt/local/include', '/opt/local/lib')
|
41
|
-
|
42
|
-
unless ["", ""] == libtiff_dirs
|
43
|
-
HEADER_DIRS.unshift libtiff_dirs.first
|
44
|
-
LIB_DIRS.unshift libtiff_dirs[1]
|
45
|
-
end
|
46
|
-
|
47
|
-
unless find_header('tiffio.h', *HEADER_DIRS)
|
48
|
-
abort "libtiff is missing. please install libtiff6-dev"
|
49
|
-
end
|
50
|
-
|
51
|
-
unless find_library('tiff', 'TIFFOpen', *LIB_DIRS)
|
52
|
-
abort "libtiff is missing. please install libtiff-dev"
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
abort "missing malloc()" unless have_func "malloc"
|
58
|
-
abort "missing free()" unless have_func "free"
|
59
|
-
|
60
|
-
|
61
|
-
create_makefile "tifffile/tifffile"
|
62
|
-
|
data/ext/tifffile/tifffile.cpp
DELETED
@@ -1,237 +0,0 @@
|
|
1
|
-
#include <ruby.h>
|
2
|
-
#include <stdio.h>
|
3
|
-
#include <stdlib.h>
|
4
|
-
#include <string>
|
5
|
-
#include "tiffio.h"
|
6
|
-
#include <vector>
|
7
|
-
#include <algorithm>
|
8
|
-
|
9
|
-
using namespace std;
|
10
|
-
|
11
|
-
template <class T>
|
12
|
-
static bool rows_size_compare(std::vector<T> & a, std::vector<T> & b)
|
13
|
-
{
|
14
|
-
return (a.size() < b.size());
|
15
|
-
}
|
16
|
-
|
17
|
-
template <class T>
|
18
|
-
void calculate_width_height(std::vector<std::vector<T> > & data, uint32 & width, uint32 & height){
|
19
|
-
height = data.size();
|
20
|
-
width = std::max_element(data.begin(), data.end(), rows_size_compare<T>)->size();
|
21
|
-
}
|
22
|
-
|
23
|
-
|
24
|
-
template <class T>
|
25
|
-
void write_data_to_row_buffer(std::vector<T> & data, unsigned char *buf, uint64 buff_size, uint8 sampleperpixel, uint8 bitspersample){
|
26
|
-
memset(buf, 0, buff_size);
|
27
|
-
buff_size = std::min<uint64>(buff_size, sizeof(T) * data.size());
|
28
|
-
memcpy(buf, (void *)(&(data[0])), buff_size);
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
template <class T>
|
33
|
-
bool write_tiff_file(std::string filename, std::vector<std::vector<T> > & data, uint8 sampleperpixel, uint8 bitspersample, std::string description, std::string software){
|
34
|
-
try {
|
35
|
-
TIFF* tif = TIFFOpen(filename.c_str(), "w");
|
36
|
-
|
37
|
-
uint32 width, height;
|
38
|
-
calculate_width_height(data, width, height);
|
39
|
-
|
40
|
-
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
|
41
|
-
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
|
42
|
-
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, sampleperpixel);
|
43
|
-
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bitspersample);
|
44
|
-
TIFFSetField(tif, TIFFTAG_ORIENTATION, (int)ORIENTATION_TOPLEFT);
|
45
|
-
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
46
|
-
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
|
47
|
-
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
|
48
|
-
TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, (char*)description.c_str());
|
49
|
-
TIFFSetField(tif, TIFFTAG_SOFTWARE, (char*)software.c_str());
|
50
|
-
|
51
|
-
uint64 linebytes = sampleperpixel * width * (bitspersample / 8);
|
52
|
-
unsigned char *buf = NULL;
|
53
|
-
buf = (unsigned char *)_TIFFmalloc(linebytes);
|
54
|
-
|
55
|
-
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
|
56
|
-
|
57
|
-
for (uint32 row = 0; row < height; row++){
|
58
|
-
std::vector<T> row_data = data[row];
|
59
|
-
write_data_to_row_buffer(row_data, buf, linebytes, sampleperpixel, bitspersample);
|
60
|
-
if (TIFFWriteScanline(tif, buf, row, 0) < 0)
|
61
|
-
break;
|
62
|
-
}
|
63
|
-
|
64
|
-
if (buf)
|
65
|
-
_TIFFfree(buf);
|
66
|
-
|
67
|
-
TIFFClose(tif);
|
68
|
-
}
|
69
|
-
catch (...){
|
70
|
-
return false;
|
71
|
-
}
|
72
|
-
return true;
|
73
|
-
}
|
74
|
-
|
75
|
-
|
76
|
-
bool get_matrix_element_type(VALUE data_matrix, bool &is_float){
|
77
|
-
if (!RB_TYPE_P(data_matrix, T_ARRAY) || RARRAY_LEN(data_matrix) < 1)
|
78
|
-
return false;
|
79
|
-
|
80
|
-
VALUE first_row = RARRAY_PTR(data_matrix)[0];
|
81
|
-
|
82
|
-
if (!RB_TYPE_P(first_row, T_ARRAY) || RARRAY_LEN(first_row) < 1)
|
83
|
-
return false;
|
84
|
-
|
85
|
-
VALUE first_item = RARRAY_PTR(first_row)[0];
|
86
|
-
|
87
|
-
if (!RB_TYPE_P(first_item, T_FIXNUM) && !RB_TYPE_P(first_item, T_FLOAT))
|
88
|
-
return false;
|
89
|
-
|
90
|
-
is_float = RB_TYPE_P(first_item, T_FLOAT);
|
91
|
-
|
92
|
-
return true;
|
93
|
-
}
|
94
|
-
|
95
|
-
template <class F, class T>
|
96
|
-
vector<vector<T> > matrix_type_cast(vector<vector<F> > & from){
|
97
|
-
vector<vector<T> > result;
|
98
|
-
result.resize(from.size());
|
99
|
-
|
100
|
-
for (int i = 0; i < from.size(); i++)
|
101
|
-
result[i].assign(from[i].begin(), from[i].end());
|
102
|
-
|
103
|
-
return result;
|
104
|
-
};
|
105
|
-
|
106
|
-
VALUE TiffFile = Qnil;
|
107
|
-
|
108
|
-
VALUE method_tifffile_converter_to_tiff(VALUE self, VALUE filename, VALUE data_matrix, VALUE sample_size, VALUE sample_unsigned, VALUE description, VALUE software){
|
109
|
-
data_matrix = rb_check_array_type(data_matrix);
|
110
|
-
|
111
|
-
|
112
|
-
Check_Type(filename, T_STRING);
|
113
|
-
Check_Type(data_matrix, T_ARRAY);
|
114
|
-
Check_Type(sample_size, T_FIXNUM);
|
115
|
-
Check_Type(description, T_STRING);
|
116
|
-
Check_Type(software, T_STRING);
|
117
|
-
|
118
|
-
uint8 size = std::min<uint8>(NUM2USHORT(sample_size), 8);
|
119
|
-
|
120
|
-
bool unsigned_flag = RTEST(sample_unsigned);
|
121
|
-
|
122
|
-
bool is_float_matrix;
|
123
|
-
if (!get_matrix_element_type(data_matrix, is_float_matrix))
|
124
|
-
rb_raise(rb_eRuntimeError, "Invalid matrix items type");
|
125
|
-
|
126
|
-
if (size != 1 && size != 2 && size != 4 && size != 8)
|
127
|
-
rb_raise(rb_eRuntimeError, "Sample size should be in range [1, 2, 4, 8]");
|
128
|
-
|
129
|
-
if (is_float_matrix && (size % 4) != 0)
|
130
|
-
rb_raise(rb_eRuntimeError, "Sample size should be 4 or 8 on non-fixnum matrix");
|
131
|
-
|
132
|
-
vector<vector<double> > data_d;
|
133
|
-
vector<double> temp_d;
|
134
|
-
vector<vector<int64> > data_i;
|
135
|
-
vector<int64> temp_i;
|
136
|
-
|
137
|
-
VALUE row, item;
|
138
|
-
|
139
|
-
if (is_float_matrix)
|
140
|
-
data_d.resize(RARRAY_LEN(data_matrix));
|
141
|
-
else
|
142
|
-
data_i.resize(RARRAY_LEN(data_matrix));
|
143
|
-
|
144
|
-
|
145
|
-
for (long i = 0; i < RARRAY_LEN(data_matrix); i++){
|
146
|
-
row = RARRAY_PTR(data_matrix)[i];
|
147
|
-
|
148
|
-
if (!RB_TYPE_P(row, T_ARRAY))
|
149
|
-
rb_raise(rb_eRuntimeError, "Matrix row %ld is not an array", i);
|
150
|
-
|
151
|
-
// Clear row buffer
|
152
|
-
if (is_float_matrix){
|
153
|
-
temp_d.clear();
|
154
|
-
temp_d.resize(RARRAY_LEN(row));
|
155
|
-
} else {
|
156
|
-
temp_i.clear();
|
157
|
-
temp_i.resize(RARRAY_LEN(row));
|
158
|
-
}
|
159
|
-
|
160
|
-
|
161
|
-
// Read row
|
162
|
-
for (long j = 0; j < RARRAY_LEN(row); j++){
|
163
|
-
item = RARRAY_PTR(row)[j];
|
164
|
-
Check_Type(item, is_float_matrix ? T_FLOAT : T_FIXNUM);
|
165
|
-
if (is_float_matrix)
|
166
|
-
temp_d[j] = RFLOAT_VALUE(item);
|
167
|
-
else
|
168
|
-
temp_i[j] = FIX2LONG(item);
|
169
|
-
}
|
170
|
-
|
171
|
-
if (is_float_matrix)
|
172
|
-
data_d[i] = temp_d;
|
173
|
-
else
|
174
|
-
data_i[i] = temp_i;
|
175
|
-
}
|
176
|
-
|
177
|
-
|
178
|
-
bool result = false;
|
179
|
-
if (is_float_matrix){
|
180
|
-
if (size == 8)
|
181
|
-
result = write_tiff_file<double>(StringValuePtr(filename), data_d, 1, 64, StringValuePtr(description), StringValuePtr(software));
|
182
|
-
else if (size == 4){
|
183
|
-
vector<vector<float> > cast_buffer = matrix_type_cast<double, float>(data_d);
|
184
|
-
result = write_tiff_file<float>(StringValuePtr(filename), cast_buffer, 1, 32, StringValuePtr(description), StringValuePtr(software));
|
185
|
-
}
|
186
|
-
else
|
187
|
-
rb_raise(rb_eRuntimeError, "unrecognized sample size for float matrix : %d", size);
|
188
|
-
}
|
189
|
-
else {
|
190
|
-
if (unsigned_flag){
|
191
|
-
if (size == 8){
|
192
|
-
vector<vector<uint64> > cast_buffer = matrix_type_cast<int64, uint64>(data_i);
|
193
|
-
result = write_tiff_file<uint64>(StringValuePtr(filename), cast_buffer, 1, 64, StringValuePtr(description), StringValuePtr(software));
|
194
|
-
}
|
195
|
-
else if (size == 4){
|
196
|
-
vector<vector<uint32> > cast_buffer = matrix_type_cast<int64, uint32>(data_i);
|
197
|
-
result = write_tiff_file<uint32>(StringValuePtr(filename), cast_buffer, 1, 32, StringValuePtr(description), StringValuePtr(software));
|
198
|
-
}
|
199
|
-
else if (size == 2){
|
200
|
-
vector<vector<uint16> > cast_buffer = matrix_type_cast<int64, uint16>(data_i);
|
201
|
-
result = write_tiff_file<uint16>(StringValuePtr(filename), cast_buffer, 1, 16, StringValuePtr(description), StringValuePtr(software));
|
202
|
-
}
|
203
|
-
else if (size == 1){
|
204
|
-
vector<vector<uint8> > cast_buffer = matrix_type_cast<int64, uint8>(data_i);
|
205
|
-
result = write_tiff_file<uint8>(StringValuePtr(filename), cast_buffer, 1, 8, StringValuePtr(description), StringValuePtr(software));
|
206
|
-
}
|
207
|
-
else
|
208
|
-
rb_raise(rb_eRuntimeError, "unrecognized sample size for unsigned numeric matrix : %d", size);
|
209
|
-
}
|
210
|
-
else {
|
211
|
-
if (size == 8){
|
212
|
-
result = write_tiff_file<int64>(StringValuePtr(filename), data_i, 1, 64, StringValuePtr(description), StringValuePtr(software));
|
213
|
-
}
|
214
|
-
else if (size == 4){
|
215
|
-
vector<vector<int32> > cast_buffer = matrix_type_cast<int64, int32>(data_i);
|
216
|
-
result = write_tiff_file<int32>(StringValuePtr(filename), cast_buffer, 1, 32, StringValuePtr(description), StringValuePtr(software));
|
217
|
-
}
|
218
|
-
else if (size == 2){
|
219
|
-
vector<vector<int16> > cast_buffer = matrix_type_cast<int64, int16>(data_i);
|
220
|
-
result = write_tiff_file<int16>(StringValuePtr(filename), cast_buffer, 1, 16, StringValuePtr(description), StringValuePtr(software));
|
221
|
-
}
|
222
|
-
else if (size == 1){
|
223
|
-
vector<vector<int8> > cast_buffer = matrix_type_cast<int64, int8>(data_i);
|
224
|
-
result = write_tiff_file<int8>(StringValuePtr(filename), cast_buffer, 1, 8, StringValuePtr(description), StringValuePtr(software));
|
225
|
-
}
|
226
|
-
else
|
227
|
-
rb_raise(rb_eRuntimeError, "unrecognized sample size for signed numeric matrix : %d", size);
|
228
|
-
}
|
229
|
-
}
|
230
|
-
|
231
|
-
return result ? Qtrue : Qfalse;
|
232
|
-
}
|
233
|
-
|
234
|
-
extern "C" void Init_tifffile(){
|
235
|
-
TiffFile = rb_define_module("TiffFile");
|
236
|
-
rb_define_singleton_method(TiffFile, "to_tiff", (VALUE(*)(ANYARGS))method_tifffile_converter_to_tiff, 6);
|
237
|
-
}
|