mc_dot_art_maker 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/{lib → deprecated/lib}/mc_dot_art_maker/cell.rb +1 -1
- data/{lib → deprecated/lib}/mc_dot_art_maker/table.rb +9 -5
- data/example/make_dot_art/make_dot_art.rb +15 -5
- data/example/make_dot_art/output/schematic/test_image.schematic +0 -0
- data/lib/mc_dot_art_maker/block.rb +4 -3
- data/lib/mc_dot_art_maker/constants.rb +1 -1
- data/lib/mc_dot_art_maker/dot.rb +30 -0
- data/lib/mc_dot_art_maker/maker.rb +171 -0
- data/lib/mc_dot_art_maker/schematic_helper.rb +1 -1
- data/lib/mc_dot_art_maker.rb +4 -2
- data/mc_dot_art_maker.gemspec +1 -1
- data/test/palette.png +0 -0
- data/test/test_block_palette.rb +3 -3
- data/test/test_dither_method.rb +2 -2
- data/test/test_image_FloydSteinbergDitherMethod.png +0 -0
- data/test/test_image_NoDitherMethod.png +0 -0
- data/test/test_image_RiemersmaDitherMethod.png +0 -0
- data/test/test_image_mosaic.png +0 -0
- data/test/test_image_texture.png +0 -0
- data/test/test_mosaic.rb +4 -4
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36ae0027b41b20d19212440a241e7ad9dc1c133d
|
4
|
+
data.tar.gz: 34777d07dadd29b03deeaac615c279963383fd9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 251d52749d1b30b3b5191abc1b47ed3b41f74e6f17e8837afa9549cc1a39240d929a3e9017e38c32c1de22eacc8d880e8582da6a9ccd4080eae73fb851b884e7
|
7
|
+
data.tar.gz: f46451b5794615b3fd6162c3d104d2c5c38671daba2a5413270ca1b215bfe5744e292729233d84c48873bed6852dfd9517b837eddb9b9e7631db74391df52edb
|
data/README.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
1
|
# MCDotArtMaker
|
2
|
+
This gem will help you to create dot-art in Minecraft world.
|
2
3
|
|
3
|
-
|
4
|
+
# Function
|
5
|
+
- Converting images(.png .jpg ...) to dot-art using Minecraft texture.
|
6
|
+
- Also you can maker .schematic files so that you can paste dot-art to Minecraft world easily.
|
7
|
+
|
8
|
+
# Install
|
9
|
+
This gem uses RMagick which requires ImageMagick. So first of all,you need to install ImageMagick.
|
10
|
+
Then run `gem install mc_dot_art_maker`
|
11
|
+
# Usage
|
12
|
+
See examples.
|
13
|
+
|
14
|
+
First, load image files.
|
15
|
+
`maker = MCDotArtMaker::Maker.new("test_image.jpg")`
|
16
|
+
You can resize images like this: `maker.resize_to_fit(50,50)`
|
17
|
+
This means the output image's width/height is less than 50 blocks.
|
18
|
+
|
19
|
+
Run this command to write dot-art: `maker.texture_image.write "test_image_texture.png"`
|
20
|
+
Also you can write dot-art without using Minecraft textures: `maker.mosaic_image.write "test_image_mosaic.png"`
|
@@ -80,6 +80,9 @@ module MCDotArtMaker
|
|
80
80
|
load_image unless image_loaded?
|
81
81
|
calc_nearest_block unless calculation_done?
|
82
82
|
end
|
83
|
+
def reset
|
84
|
+
load_image
|
85
|
+
end
|
83
86
|
|
84
87
|
def texture_image(size = TEXTURE_SIZE)
|
85
88
|
# 近似ブロック色でのモザイク画像を返す
|
@@ -108,9 +111,7 @@ module MCDotArtMaker
|
|
108
111
|
@schematic_helper.length = @height
|
109
112
|
@schematic_helper.write filename
|
110
113
|
end
|
111
|
-
|
112
|
-
!@cells.nil?
|
113
|
-
end
|
114
|
+
|
114
115
|
private
|
115
116
|
def calc_nearest_block
|
116
117
|
MCDotArtMaker.puts "Calc nearest block...."
|
@@ -156,12 +157,15 @@ module MCDotArtMaker
|
|
156
157
|
(@width*@height).times do |i|
|
157
158
|
x = i % @width #列番号・横方向: x
|
158
159
|
y = i / @width #行番号・縦方向: y
|
159
|
-
@cells << Cell.new(@image,x,y)
|
160
|
+
# @cells << Cell.new(@image,x,y)
|
161
|
+
@cells << Dot.new(@image,x,y)
|
160
162
|
end
|
161
163
|
MCDotArtMaker.puts "Done!"
|
162
164
|
|
163
165
|
@calculation_count = 0
|
164
166
|
end
|
165
|
-
|
167
|
+
def image_loaded?
|
168
|
+
!@cells.nil?
|
169
|
+
end
|
166
170
|
end
|
167
171
|
end
|
@@ -1,11 +1,21 @@
|
|
1
1
|
require_relative '../../lib/mc_dot_art_maker'
|
2
2
|
|
3
3
|
Dir::entries("src").reject{|e| e[0]=='.'}.each do |entry|
|
4
|
-
table = MCDotArtMaker::Table.new("src/#{entry}")
|
4
|
+
# table = MCDotArtMaker::Table.new("src/#{entry}")
|
5
|
+
# base = entry.split('.').first
|
6
|
+
#
|
7
|
+
# table.resize_to_fit(500,500)
|
8
|
+
# table.texture_image.write "output/texture/#{base}.png"
|
9
|
+
# table.mosaic_image.write "output/mosaic/#{base}.png"
|
10
|
+
# table.write_schematic "output/schematic/#{base}.schematic"
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
maker = MCDotArtMaker::Maker.new("src/#{entry}")
|
5
15
|
base = entry.split('.').first
|
6
16
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
17
|
+
maker.resize_to_fit(500,500)
|
18
|
+
maker.texture_image.write "output/texture/#{base}.png"
|
19
|
+
maker.mosaic_image.write "output/mosaic/#{base}.png"
|
20
|
+
maker.write_schematic "output/schematic/#{base}.schematic"
|
11
21
|
end
|
Binary file
|
@@ -14,15 +14,16 @@ module MCDotArtMaker
|
|
14
14
|
@texture = tx.resize(TEXTURE_SIZE,TEXTURE_SIZE)
|
15
15
|
end
|
16
16
|
def texture(size=TEXTURE_SIZE)
|
17
|
+
# resize if texture size is not match
|
17
18
|
if size != TEXTURE_SIZE
|
18
19
|
@texture.resize(size,size)
|
19
20
|
else
|
20
21
|
@texture
|
21
22
|
end
|
22
23
|
end
|
23
|
-
def to_lab
|
24
|
-
|
25
|
-
end
|
24
|
+
# def to_lab
|
25
|
+
# @color.to_lab
|
26
|
+
# end
|
26
27
|
def to_rmagic_color
|
27
28
|
# p "calc color :#{@color.r} #{@color.g} #{@color.b}"
|
28
29
|
Magick::Pixel.new(@color.r*257, @color.g*257, @color.b*257)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module MCDotArtMaker
|
2
|
+
class Dot
|
3
|
+
attr_reader :color
|
4
|
+
attr_accessor :block
|
5
|
+
def initialize(image,x,y)
|
6
|
+
pixel = image.pixel_color(x,y)
|
7
|
+
r = pixel.red / 257
|
8
|
+
g = pixel.green / 257
|
9
|
+
b = pixel.blue / 257
|
10
|
+
@color = Color::RGB.new(r, g, b)
|
11
|
+
end
|
12
|
+
# def set_color(r,g,b)
|
13
|
+
# @color = Color::RGB.new(r, g, b)
|
14
|
+
# # p "set color #{r} #{g} #{b}"
|
15
|
+
# end
|
16
|
+
# def to_lab
|
17
|
+
# @color.to_lab
|
18
|
+
# end
|
19
|
+
def to_rmagic_color
|
20
|
+
# p "calc color :#{@color.r} #{@color.g} #{@color.b}"
|
21
|
+
Magick::Pixel.new(@color.r*257, @color.g*257, @color.b*257)
|
22
|
+
end
|
23
|
+
def comparitor
|
24
|
+
Color::Comparison.new(@color)
|
25
|
+
end
|
26
|
+
# def image=(other)
|
27
|
+
# @image = other.resize(16,16)
|
28
|
+
# end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
module MCDotArtMaker
|
2
|
+
class Maker
|
3
|
+
attr_reader :width, :height, :cells
|
4
|
+
# include Enumerable
|
5
|
+
|
6
|
+
def initialize(filename,dither_method = RiemersmaDitherMethod)
|
7
|
+
# モザイクにしたい元画像をセット
|
8
|
+
if filename.instance_of? String
|
9
|
+
@image = Magick::ImageList.new(filename).first
|
10
|
+
elsif filename.instance_of? Magick::Image
|
11
|
+
@image = filename
|
12
|
+
end
|
13
|
+
@dither_method = dither_method
|
14
|
+
|
15
|
+
@schematic_helper = MCDotArtMaker::SchematicHelper.instance
|
16
|
+
@schematic_helper.read File.expand_path('../seed.schematic', __FILE__)
|
17
|
+
@block_list = MCDotArtMaker::BlockList.instance
|
18
|
+
|
19
|
+
@calculation_count = 0 # 近似ブロック計算が終わったらインクリメント
|
20
|
+
end
|
21
|
+
def resize_to_fit(width, height)
|
22
|
+
@image = @image.resize_to_fit(width, height)
|
23
|
+
end
|
24
|
+
def [](row,col)
|
25
|
+
load_image unless image_loaded?
|
26
|
+
@cells[row*@width + col]
|
27
|
+
end
|
28
|
+
def []=(row,col,newValue)
|
29
|
+
load_image unless image_loaded?
|
30
|
+
@cells[row*@width + col] = newValue
|
31
|
+
end
|
32
|
+
def each(size = 1)
|
33
|
+
load_image unless image_loaded?
|
34
|
+
@cells.each_with_index do |c,i|
|
35
|
+
x = (i % @width) * size #列番号・横方向: x
|
36
|
+
y = (i/@width) * size #行番号・縦方向: y
|
37
|
+
yield c,x,y
|
38
|
+
# cell,cellの左上のx座標 ,cellの左上のy座標
|
39
|
+
end
|
40
|
+
end
|
41
|
+
def each_with_index(size = 1)
|
42
|
+
load_image unless image_loaded?
|
43
|
+
@cells.each_with_index do |c,i|
|
44
|
+
x = (i % @width) * size #列番号・横方向: x
|
45
|
+
y = (i/@width) * size #行番号・縦方向: y
|
46
|
+
yield c,i,x,y
|
47
|
+
# cell,cellの左上のx座標 ,cellの左上のy座標
|
48
|
+
end
|
49
|
+
end
|
50
|
+
def block_ids
|
51
|
+
load_image unless image_loaded?
|
52
|
+
tmp = []
|
53
|
+
each do |c|
|
54
|
+
tmp << c.block.id
|
55
|
+
end
|
56
|
+
tmp
|
57
|
+
end
|
58
|
+
def block_data
|
59
|
+
load_image unless image_loaded?
|
60
|
+
tmp = []
|
61
|
+
each do |c|
|
62
|
+
tmp << c.block.data
|
63
|
+
end
|
64
|
+
tmp
|
65
|
+
end
|
66
|
+
def mosaic_image(size = 1)
|
67
|
+
# モザイク化した画像を返す
|
68
|
+
calculate
|
69
|
+
|
70
|
+
new_image = Magick::Image.new(@width*size, @height*size){ self.background_color = "white" }
|
71
|
+
each(size) do |c,x,y|
|
72
|
+
idr = Magick::Draw.new
|
73
|
+
idr.fill = c.block.to_rmagic_color
|
74
|
+
idr.rectangle(x, y, x + size, y + size)
|
75
|
+
idr.draw(new_image)
|
76
|
+
end
|
77
|
+
new_image
|
78
|
+
end
|
79
|
+
def calculate
|
80
|
+
load_image unless image_loaded?
|
81
|
+
calc_nearest_block unless calculation_done?
|
82
|
+
end
|
83
|
+
def reset
|
84
|
+
load_image
|
85
|
+
end
|
86
|
+
|
87
|
+
def texture_image(size = TEXTURE_SIZE)
|
88
|
+
# 近似ブロック色でのモザイク画像を返す
|
89
|
+
calculate
|
90
|
+
|
91
|
+
new_image = Magick::Image.new(@width*size, @height*size){ self.background_color = "white" }
|
92
|
+
each(size) do |c,x,y|
|
93
|
+
new_image.composite!(c.block.texture(size), x, y, Magick::OverCompositeOp)
|
94
|
+
end
|
95
|
+
new_image
|
96
|
+
end
|
97
|
+
|
98
|
+
def write_schematic(filename)
|
99
|
+
calculate
|
100
|
+
|
101
|
+
@schematic_helper.blocks = block_ids
|
102
|
+
@schematic_helper.data = block_data
|
103
|
+
@schematic_helper.weOffsetX = 0
|
104
|
+
@schematic_helper.weOffsetY = 0
|
105
|
+
@schematic_helper.weOffsetZ = 0
|
106
|
+
@schematic_helper.weOriginX = 1
|
107
|
+
@schematic_helper.weOriginY = 0
|
108
|
+
@schematic_helper.weOriginZ = 0
|
109
|
+
@schematic_helper.height = 1
|
110
|
+
@schematic_helper.width = @width
|
111
|
+
@schematic_helper.length = @height
|
112
|
+
@schematic_helper.write filename
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
def calc_nearest_block
|
117
|
+
MCDotArtMaker.puts "Calc nearest block...."
|
118
|
+
@nearest_color_cash ||= {}
|
119
|
+
|
120
|
+
each_with_index do |cell,index|
|
121
|
+
puts "Calculating #{index+1} of #{@cells.size}" if ((index+1) % 10000 == 0)|| (index+1 == @cells.size)
|
122
|
+
if @nearest_color_cash.include?(cell.color)
|
123
|
+
cell.block = @nearest_color_cash[cell.color]
|
124
|
+
else
|
125
|
+
comparitor = cell.comparitor
|
126
|
+
block_distance_list = {}
|
127
|
+
@block_list.each do |block|
|
128
|
+
block_distance_list[block] = comparitor.compare(block.color)
|
129
|
+
end
|
130
|
+
nearest_block = block_distance_list.min{ |x, y| x[1] <=> y[1] }[0] #[0]: key [1]: value
|
131
|
+
@nearest_color_cash[cell.color] = nearest_block
|
132
|
+
cell.block = nearest_block
|
133
|
+
|
134
|
+
MCDotArtMaker.puts "Cashed new color #{@nearest_color_cash.size} of #{@block_list.size}"
|
135
|
+
end
|
136
|
+
@calculation_count += 1
|
137
|
+
end
|
138
|
+
MCDotArtMaker.puts "Done!"
|
139
|
+
end
|
140
|
+
def calculation_done?
|
141
|
+
@cells.size == @calculation_count
|
142
|
+
end
|
143
|
+
def load_image
|
144
|
+
# - width - 絵の横方向の大きさ
|
145
|
+
# - height - 絵の縦方向の大きさ
|
146
|
+
# 端っこは切り捨てる
|
147
|
+
@width = @image.columns
|
148
|
+
@height = @image.rows
|
149
|
+
@cells = []
|
150
|
+
|
151
|
+
|
152
|
+
MCDotArtMaker.puts "remapping..."
|
153
|
+
@image = @image.remap(@block_list.to_remap_image,@dither_method)
|
154
|
+
MCDotArtMaker.puts "Done!"
|
155
|
+
|
156
|
+
MCDotArtMaker.puts "Registering cells..."
|
157
|
+
(@width*@height).times do |i|
|
158
|
+
x = i % @width #列番号・横方向: x
|
159
|
+
y = i / @width #行番号・縦方向: y
|
160
|
+
# @cells << Cell.new(@image,x,y)
|
161
|
+
@cells << Dot.new(@image,x,y)
|
162
|
+
end
|
163
|
+
MCDotArtMaker.puts "Done!"
|
164
|
+
|
165
|
+
@calculation_count = 0
|
166
|
+
end
|
167
|
+
def image_loaded?
|
168
|
+
!@cells.nil?
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -77,7 +77,7 @@ module MCDotArtMaker
|
|
77
77
|
@modified = true
|
78
78
|
end
|
79
79
|
def write(name)
|
80
|
-
raise(IllegalBlockSizeError,"Blocks or Data size doesn't match length*width*height") unless verify
|
80
|
+
raise(IllegalBlockSizeError,"Blocks or Data size doesn't match length*width*height: Block size #{@blocks.size}, width #{@width}, height #{@height}, length #{@length}") unless verify
|
81
81
|
|
82
82
|
@tag.find_tag("Blocks").payload = to_nbt_block
|
83
83
|
@tag.find_tag("Data").payload = to_nbt_data
|
data/lib/mc_dot_art_maker.rb
CHANGED
@@ -8,7 +8,9 @@ require File.expand_path('../mc_dot_art_maker/constants.rb', __FILE__)
|
|
8
8
|
require File.expand_path('../mc_dot_art_maker/extern_lib_extension.rb', __FILE__)
|
9
9
|
require File.expand_path('../mc_dot_art_maker/block.rb', __FILE__)
|
10
10
|
require File.expand_path('../mc_dot_art_maker/block_list.rb', __FILE__)
|
11
|
-
require File.expand_path('../mc_dot_art_maker/cell.rb', __FILE__)
|
12
|
-
require File.expand_path('../mc_dot_art_maker/
|
11
|
+
# require File.expand_path('../mc_dot_art_maker/cell.rb', __FILE__)
|
12
|
+
require File.expand_path('../mc_dot_art_maker/dot.rb', __FILE__)
|
13
|
+
require File.expand_path('../mc_dot_art_maker/maker.rb', __FILE__)
|
14
|
+
# require File.expand_path('../mc_dot_art_maker/table.rb', __FILE__)
|
13
15
|
require File.expand_path('../mc_dot_art_maker/schematic_helper.rb', __FILE__)
|
14
16
|
require File.expand_path('../mc_dot_art_maker/utils.rb', __FILE__)
|
data/mc_dot_art_maker.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'mc_dot_art_maker'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.3.0'
|
4
4
|
s.licenses = ['MIT']
|
5
5
|
s.summary = 'Dot Art Maker for Minecraft'
|
6
6
|
s.description = 'Converting images to mosaic arts using Minecraft textures and .schematic files.'
|
data/test/palette.png
CHANGED
Binary file
|
data/test/test_block_palette.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative '../lib/mc_dot_art_maker'
|
2
2
|
module MCDotArtMaker
|
3
|
-
class
|
3
|
+
class Maker
|
4
4
|
attr_reader :block_list
|
5
5
|
end
|
6
6
|
end
|
7
|
-
|
8
|
-
|
7
|
+
maker = MCDotArtMaker::Maker.new("test_image.jpg")
|
8
|
+
maker.block_list.to_remap_image.write("palette.png")
|
data/test/test_dither_method.rb
CHANGED
@@ -6,6 +6,6 @@ methods = [MCDotArtMaker::NoDitherMethod,MCDotArtMaker::RiemersmaDitherMethod,MC
|
|
6
6
|
methods.each do |m|
|
7
7
|
fn = Magick::ImageList.new("test_image.jpg").first
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
maker = MCDotArtMaker::Maker.new(fn,m)
|
10
|
+
maker.texture_image.write "test_image_#{m}.png"
|
11
11
|
end
|
Binary file
|
Binary file
|
Binary file
|
data/test/test_image_mosaic.png
CHANGED
Binary file
|
data/test/test_image_texture.png
CHANGED
Binary file
|
data/test/test_mosaic.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative '../lib/mc_dot_art_maker'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
maker = MCDotArtMaker::Maker.new("test_image.jpg")
|
4
|
+
maker.resize_to_fit(50,50)
|
5
|
+
maker.texture_image.write "test_image_texture.png"
|
6
|
+
maker.mosaic_image.write "test_image_mosaic.png"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mc_dot_art_maker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kumassy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -121,6 +121,8 @@ files:
|
|
121
121
|
- LICENSE
|
122
122
|
- README.md
|
123
123
|
- Rakefile
|
124
|
+
- deprecated/lib/mc_dot_art_maker/cell.rb
|
125
|
+
- deprecated/lib/mc_dot_art_maker/table.rb
|
124
126
|
- example/make_dot_art/make_dot_art.rb
|
125
127
|
- example/make_dot_art/output/mosaic/test_image.png
|
126
128
|
- example/make_dot_art/output/schematic/test_image.schematic
|
@@ -129,12 +131,12 @@ files:
|
|
129
131
|
- lib/mc_dot_art_maker.rb
|
130
132
|
- lib/mc_dot_art_maker/block.rb
|
131
133
|
- lib/mc_dot_art_maker/block_list.rb
|
132
|
-
- lib/mc_dot_art_maker/cell.rb
|
133
134
|
- lib/mc_dot_art_maker/constants.rb
|
135
|
+
- lib/mc_dot_art_maker/dot.rb
|
134
136
|
- lib/mc_dot_art_maker/extern_lib_extension.rb
|
137
|
+
- lib/mc_dot_art_maker/maker.rb
|
135
138
|
- lib/mc_dot_art_maker/schematic_helper.rb
|
136
139
|
- lib/mc_dot_art_maker/seed.schematic
|
137
|
-
- lib/mc_dot_art_maker/table.rb
|
138
140
|
- lib/mc_dot_art_maker/textures/anvil_base.png
|
139
141
|
- lib/mc_dot_art_maker/textures/anvil_top_damaged_0.png
|
140
142
|
- lib/mc_dot_art_maker/textures/anvil_top_damaged_1.png
|