pixelart 1.3.6 → 1.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +2 -0
- data/README.md +13 -10
- data/Rakefile +3 -3
- data/lib/pixelart/base.rb +6 -0
- data/lib/pixelart/composite.rb +1 -1
- data/lib/pixelart/convert.rb +7 -4
- data/lib/pixelart/image.rb +34 -13
- data/lib/pixelart/invert.rb +40 -0
- data/lib/pixelart/orc721/generator.rb +51 -0
- data/lib/pixelart/sketch.rb +69 -14
- data/lib/pixelart/version.rb +1 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 931c4aa26d5a0594b4aec85f532d16e93d3dd505f4d2f9729b24e3fd45c662c4
|
4
|
+
data.tar.gz: 5dc8936fc9a0f76b05cf4209ad69ebeba87f25bd3c0290cad59e961760aa5782
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3189094ecb75f30d1ccd52bafc83b6ece3319b0b5c4f769ab02110212b5674adc59a816dc2abfa8be3d9a6a344bd253471677d5802391325b681987eb9d5ece0
|
7
|
+
data.tar.gz: a1e6e2ea6c25ac1ed7f2542ff8039a8ac1b5232001539611a151302959563e623d879e9c6590aa4cc1468d7716eb7ffaa8faeeed9360589570664a94f512aa48
|
data/Manifest.txt
CHANGED
@@ -10,8 +10,10 @@ lib/pixelart/composite.rb
|
|
10
10
|
lib/pixelart/convert.rb
|
11
11
|
lib/pixelart/generator.rb
|
12
12
|
lib/pixelart/image.rb
|
13
|
+
lib/pixelart/invert.rb
|
13
14
|
lib/pixelart/led.rb
|
14
15
|
lib/pixelart/misc.rb
|
16
|
+
lib/pixelart/orc721/generator.rb
|
15
17
|
lib/pixelart/pixelator.rb
|
16
18
|
lib/pixelart/sample.rb
|
17
19
|
lib/pixelart/silhouette.rb
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Pixel Art
|
2
2
|
|
3
|
-
pixelart -
|
3
|
+
pixelart - yes, you can! generate your own pixel art images (off-blockchain) using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
4
4
|
|
5
5
|
|
6
|
-
* home :: [github.com/
|
7
|
-
* bugs :: [github.com/
|
6
|
+
* home :: [github.com/learnpixelart/pixelart](https://github.com/learnpixelart/pixelart)
|
7
|
+
* bugs :: [github.com/learnpixelart/pixelart/issues](https://github.com/learnpixelart/pixelart/issues)
|
8
8
|
* gem :: [rubygems.org/gems/pixelart](https://rubygems.org/gems/pixelart)
|
9
9
|
* rdoc :: [rubydoc.info/gems/pixelart](http://rubydoc.info/gems/pixelart)
|
10
10
|
|
@@ -71,8 +71,8 @@ img3x.save( './i/mooncat_white-3x.png' )
|
|
71
71
|
|
72
72
|
Voila!
|
73
73
|
|
74
|
-
![](https://github.com/
|
75
|
-
![](https://github.com/
|
74
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/mooncat_white.png)
|
75
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/mooncat_white-3x.png)
|
76
76
|
|
77
77
|
|
78
78
|
|
@@ -100,8 +100,8 @@ img3x.save( './i/mooncat_black-3x.png' )
|
|
100
100
|
|
101
101
|
Voila! Black is the new White!
|
102
102
|
|
103
|
-
![](https://github.com/
|
104
|
-
![](https://github.com/
|
103
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/mooncat_black.png)
|
104
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/mooncat_black-3x.png)
|
105
105
|
|
106
106
|
|
107
107
|
|
@@ -227,8 +227,8 @@ img5x.save( './i/vader5x.png' )
|
|
227
227
|
|
228
228
|
Voila!
|
229
229
|
|
230
|
-
![](https://github.com/
|
231
|
-
![](https://github.com/
|
230
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/vader.png)
|
231
|
+
![](https://github.com/learnpixelart/pixelart/raw/master/pixelart/i/vader5x.png)
|
232
232
|
|
233
233
|
|
234
234
|
|
@@ -291,6 +291,9 @@ Use it as you please with no restrictions whatsoever.
|
|
291
291
|
|
292
292
|
|
293
293
|
|
294
|
+
|
294
295
|
## Questions? Comments?
|
295
296
|
|
296
|
-
Post them
|
297
|
+
Post them over at the [Help & Support](https://github.com/geraldb/help) page. Thanks.
|
298
|
+
|
299
|
+
|
data/Rakefile
CHANGED
@@ -5,13 +5,13 @@ Hoe.spec 'pixelart' do
|
|
5
5
|
|
6
6
|
self.version = Pixelart::VERSION
|
7
7
|
|
8
|
-
self.summary = "pixelart -
|
8
|
+
self.summary = "pixelart - yes, you can! generate your own pixel art images (off-blockchain) using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes"
|
9
9
|
self.description = summary
|
10
10
|
|
11
|
-
self.urls = { home: 'https://github.com/
|
11
|
+
self.urls = { home: 'https://github.com/learnpixelart/pixelart' }
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
|
-
self.email = '
|
14
|
+
self.email = 'gerald.bauer@gmail.com'
|
15
15
|
|
16
16
|
# switch extension to .markdown for gihub formatting
|
17
17
|
self.readme_file = 'README.md'
|
data/lib/pixelart/base.rb
CHANGED
@@ -42,6 +42,7 @@ require 'pixelart/led'
|
|
42
42
|
require 'pixelart/sketch'
|
43
43
|
require 'pixelart/transparent'
|
44
44
|
require 'pixelart/silhouette'
|
45
|
+
require 'pixelart/invert'
|
45
46
|
require 'pixelart/ukraine'
|
46
47
|
|
47
48
|
|
@@ -69,4 +70,9 @@ require 'pixelart/convert'
|
|
69
70
|
|
70
71
|
|
71
72
|
|
73
|
+
####
|
74
|
+
# add orc-721 - why? why not?
|
75
|
+
require 'pixelart/orc721/generator'
|
76
|
+
|
77
|
+
|
72
78
|
puts Pixelart.banner # say hello
|
data/lib/pixelart/composite.rb
CHANGED
@@ -10,7 +10,7 @@ class ImageComposite < Image # check: (re)name to Collage, Sheet, Sprites, or s
|
|
10
10
|
def self.read( path, width: TILE_WIDTH, height: TILE_WIDTH ) ## convenience helper
|
11
11
|
img = ChunkyPNG::Image.from_file( path )
|
12
12
|
new( img, width: width,
|
13
|
-
height:
|
13
|
+
height: height )
|
14
14
|
end
|
15
15
|
|
16
16
|
|
data/lib/pixelart/convert.rb
CHANGED
@@ -36,15 +36,18 @@ def self.convert( dir, from: 'jpg',
|
|
36
36
|
system( cmd )
|
37
37
|
|
38
38
|
if from == 'gif'
|
39
|
-
##
|
39
|
+
## check for multi-images for gif
|
40
40
|
## save image-0.png to image.png
|
41
41
|
path0 = "#{outdir}/#{basename}-0.#{to}"
|
42
42
|
path = "#{outdir}/#{basename}.#{to}"
|
43
43
|
|
44
|
-
|
44
|
+
## note: image-0.png only exists (gets generated) for multi-images
|
45
|
+
if File.exist?( path0 )
|
46
|
+
puts " saving #{path0} to #{path}..."
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
+
blob = File.open( path0, 'rb' ) { |f| f.read }
|
49
|
+
File.open( path, 'wb' ) { |f| f.write( blob ) }
|
50
|
+
end
|
48
51
|
end
|
49
52
|
end
|
50
53
|
end
|
data/lib/pixelart/image.rb
CHANGED
@@ -51,7 +51,9 @@ CHARS = '.@xo^~%*+=:' ## todo/check: rename to default chars or such? why? w
|
|
51
51
|
|
52
52
|
## todo/check: support default chars encoding auto-of-the-box always
|
53
53
|
## or require user-defined chars to be passed in - why? why not?
|
54
|
-
def self.parse( pixels, colors:,
|
54
|
+
def self.parse( pixels, colors:,
|
55
|
+
background: Color::TRANSPARENT,
|
56
|
+
chars: CHARS )
|
55
57
|
has_keys = colors.is_a?(Hash) ## check if passed-in user-defined keys (via hash table)?
|
56
58
|
|
57
59
|
colors = parse_colors( colors )
|
@@ -60,6 +62,8 @@ def self.parse( pixels, colors:, chars: CHARS )
|
|
60
62
|
width = pixels.reduce(1) {|width,row| row.size > width ? row.size : width }
|
61
63
|
height = pixels.size
|
62
64
|
|
65
|
+
background = Color.parse( background ) unless background.is_a?( Integer )
|
66
|
+
|
63
67
|
img = new( width, height )
|
64
68
|
|
65
69
|
pixels.each_with_index do |row,y|
|
@@ -77,7 +81,13 @@ def self.parse( pixels, colors:, chars: CHARS )
|
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
80
|
-
|
84
|
+
|
85
|
+
img[x,y] = if background && background != Color::TRANSPARENT &&
|
86
|
+
pixel == Color::TRANSPARENT
|
87
|
+
background ## note: auto-fill transparent with background color
|
88
|
+
else
|
89
|
+
pixel
|
90
|
+
end
|
81
91
|
end # each row
|
82
92
|
end # each data
|
83
93
|
|
@@ -311,17 +321,28 @@ def image() @img; end
|
|
311
321
|
######
|
312
322
|
# helpers
|
313
323
|
def self.parse_pixels( pixels )
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
324
|
+
if pixels.is_a?( Array ) ## assume array of string (lines)
|
325
|
+
data = []
|
326
|
+
pixels.each do |line|
|
327
|
+
## convert (string) line into indidual chars
|
328
|
+
data << line.each_char.reduce( [] ) { |mem, c| mem << c; mem }
|
329
|
+
end
|
330
|
+
data
|
331
|
+
else ## assume it's a (multi-line) string (with newlines)
|
332
|
+
## assert and throw ArgumentError if not? - why? why not?
|
333
|
+
data = []
|
334
|
+
pixels.each_line do |line|
|
335
|
+
line = line.strip
|
336
|
+
next if line.start_with?( '#' ) || line.empty? ## note: allow comments and empty lines
|
337
|
+
|
338
|
+
## note: allow multiple spaces or tabs
|
339
|
+
## to separate pixel codes
|
340
|
+
## e.g. o o o o o o o o o o o o dg lg w w lg w lg lg dg dg w w lg dg o o o o o o o o o o o
|
341
|
+
## or
|
342
|
+
data << line.split( /[ \t]+/)
|
343
|
+
end
|
344
|
+
data
|
345
|
+
end
|
325
346
|
end
|
326
347
|
|
327
348
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pixelart
|
2
|
+
|
3
|
+
|
4
|
+
## todo/check:
|
5
|
+
## use a different name for invert
|
6
|
+
## - why not - negate ???
|
7
|
+
|
8
|
+
|
9
|
+
class Image
|
10
|
+
## note: invert will only invert r/g/b - and NOT the a(lpha) channel
|
11
|
+
## the a(lpha) channel get passed on as is (1:1)
|
12
|
+
def invert
|
13
|
+
img = Image.new( @img.width, @img.height )
|
14
|
+
|
15
|
+
@img.width.times do |x|
|
16
|
+
@img.height.times do |y|
|
17
|
+
pixel = @img[x,y]
|
18
|
+
|
19
|
+
## note: xor (^) with 0 returns the original value unmodified.
|
20
|
+
## xor (^) with 0xff flips the bits.
|
21
|
+
## that is we are flipping/inverting r, g and b.
|
22
|
+
## and keep the a(lpha) channel as is.
|
23
|
+
|
24
|
+
## hack - why? why not?
|
25
|
+
## if transparent e.g. 0x0 than keep as is
|
26
|
+
## do not use 0xffffff00 - makes a difference?
|
27
|
+
|
28
|
+
img[x,y] = if pixel == Color::TRANSPARENT # transparent (0)
|
29
|
+
Color::TRANSPARENT
|
30
|
+
else
|
31
|
+
pixel ^ 0xffffff00
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
img
|
36
|
+
end
|
37
|
+
|
38
|
+
end # class Image
|
39
|
+
|
40
|
+
end # module Pixelart
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Orc721
|
4
|
+
class Generator
|
5
|
+
###################
|
6
|
+
## convenience setup helper(s)
|
7
|
+
def self.read( path, width: 24, height: 24 )
|
8
|
+
new( Pixelart::ImageComposite.read( path,
|
9
|
+
width: width,
|
10
|
+
height: height ))
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def initialize( spritesheet )
|
15
|
+
### todo: check for composite image type? - why? why not?
|
16
|
+
@spritesheet = spritesheet
|
17
|
+
end
|
18
|
+
|
19
|
+
def _parse( spec )
|
20
|
+
## for delimiter allow for now: - why? why not?
|
21
|
+
## (multiple) space ( )
|
22
|
+
## command or semicolon
|
23
|
+
spec.strip.split( %r{[ ,;/_-]+} ).map {|v| v.to_i(10) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse( spec )
|
27
|
+
## convenience helper
|
28
|
+
## parses g spec in various (delimited) formats
|
29
|
+
g = _parse( spec )
|
30
|
+
generate( *g )
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate( *attributes )
|
34
|
+
img = Pixelart::Image.new( width, height )
|
35
|
+
attributes.each do |num|
|
36
|
+
img.compose!( @spritesheet[ num ] )
|
37
|
+
end
|
38
|
+
img
|
39
|
+
end
|
40
|
+
alias_method :g, :generate
|
41
|
+
|
42
|
+
def width() @spritesheet.tile_width; end
|
43
|
+
def height() @spritesheet.tile_height; end
|
44
|
+
def count() @spritesheet.count; end
|
45
|
+
end # class Generator
|
46
|
+
end # module Orc721
|
47
|
+
|
48
|
+
|
49
|
+
######
|
50
|
+
## add convenience aliases - why? why not?
|
51
|
+
ORC721 = Orc721
|
data/lib/pixelart/sketch.rb
CHANGED
@@ -3,14 +3,24 @@ module Pixelart
|
|
3
3
|
|
4
4
|
|
5
5
|
class Image
|
6
|
-
def sketch( sketch=4, line: 1
|
6
|
+
def sketch( sketch=4, line: 1,
|
7
|
+
line_color: Color::BLACK,
|
8
|
+
colorize: false )
|
9
|
+
## todo/check: rename color option to fill or such - why? why not?
|
10
|
+
|
7
11
|
# todo: line - find a better name eg. line_strenght/width or such?
|
8
12
|
width = @img.width*sketch + (@img.width+1)*line
|
9
13
|
height = @img.height*sketch + (@img.height+1)*line
|
10
14
|
|
11
15
|
puts " #{width}x#{height}"
|
12
16
|
|
13
|
-
|
17
|
+
|
18
|
+
background_color = colorize ? Color::TRANSPARENT
|
19
|
+
: Color::WHITE
|
20
|
+
|
21
|
+
|
22
|
+
img = Image.new( width, height, background_color )
|
23
|
+
|
14
24
|
|
15
25
|
@img.width.times do |x|
|
16
26
|
@img.height.times do |y|
|
@@ -19,12 +29,13 @@ class Image
|
|
19
29
|
## get surrounding pixels - if "out-of-bound" use transparent (0)
|
20
30
|
left = x == 0 ? Color::TRANSPARENT : @img[x-1,y]
|
21
31
|
top = y == 0 ? Color::TRANSPARENT : @img[x ,y-1]
|
32
|
+
diag = (x==0 || y== 0) ? Color::TRANSPARENT : @img[x-1,y-1]
|
22
33
|
|
23
34
|
if pixel != left ## draw vertical line
|
24
|
-
|
25
|
-
|
26
|
-
img[ x*sketch + line*x +
|
27
|
-
|
35
|
+
line.times do |n|
|
36
|
+
(sketch+line*2).times do |m|
|
37
|
+
img[ x*sketch + line*x + n,
|
38
|
+
m + y*sketch + line*y] = line_color
|
28
39
|
end
|
29
40
|
end
|
30
41
|
end
|
@@ -33,7 +44,7 @@ class Image
|
|
33
44
|
(sketch+line*2).times do |n|
|
34
45
|
line.times do |m|
|
35
46
|
img[n + x*sketch + line*x,
|
36
|
-
y*sketch + line*y + m] =
|
47
|
+
y*sketch + line*y + m] = line_color
|
37
48
|
end
|
38
49
|
end
|
39
50
|
end
|
@@ -42,10 +53,10 @@ class Image
|
|
42
53
|
## check special edge case for x and y to add "finish-up" right and bottom line
|
43
54
|
if x == @img.width-1 && pixel != Color::TRANSPARENT
|
44
55
|
## draw vertical line
|
45
|
-
|
46
|
-
line.times do |m|
|
47
|
-
img[ (x+1)*sketch + line*(x+1) +
|
48
|
-
|
56
|
+
line.times do |n|
|
57
|
+
(sketch+line*2).times do |m|
|
58
|
+
img[ (x+1)*sketch + line*(x+1) + n,
|
59
|
+
m + y*sketch + line*y] = line_color
|
49
60
|
end
|
50
61
|
end
|
51
62
|
end
|
@@ -55,12 +66,56 @@ class Image
|
|
55
66
|
(sketch+line*2).times do |n|
|
56
67
|
line.times do |m|
|
57
68
|
img[n + x*sketch + line*x,
|
58
|
-
(y+1)*sketch + line*(y+1) + m] =
|
69
|
+
(y+1)*sketch + line*(y+1) + m] = line_color
|
59
70
|
end
|
60
71
|
end
|
61
72
|
end
|
62
|
-
|
63
|
-
|
73
|
+
|
74
|
+
###############
|
75
|
+
## fill with pixel color if color true (default is false)
|
76
|
+
if colorize && pixel != Color::TRANSPARENT
|
77
|
+
sketch.times do |n|
|
78
|
+
sketch.times do |m|
|
79
|
+
img[x*sketch + line*(x+1) + n,
|
80
|
+
y*sketch + line*(y+1) + m] = pixel
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if pixel == left ## draw vertical line
|
85
|
+
line.times do |n|
|
86
|
+
sketch.times do |m|
|
87
|
+
img[x*sketch + line*x + n,
|
88
|
+
y*sketch + line*(y+1) + m] = pixel
|
89
|
+
# (y%2==0 ? 0x0000ffff : 0x000088ff ) # (for debugging)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
if pixel == top ## draw horizontal line
|
95
|
+
sketch.times do |n|
|
96
|
+
line.times do |m|
|
97
|
+
img[x*sketch + line*(x+1) + n,
|
98
|
+
y*sketch + line*y + m] = pixel
|
99
|
+
# (x%2==0 ? 0xff0000ff : 0x880000ff ) # (for debugging)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
## check all four same color (00,01)
|
105
|
+
## (10, x) - bingo!
|
106
|
+
if pixel == left && pixel == top && pixel == diag
|
107
|
+
line.times do |n|
|
108
|
+
line.times do |m|
|
109
|
+
img[x*sketch + line*x + n,
|
110
|
+
y*sketch + line*y + m] = pixel
|
111
|
+
# 0xffff00ff # (for debugging)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end # colorize?
|
116
|
+
|
117
|
+
end # height.times
|
118
|
+
end # width.times
|
64
119
|
|
65
120
|
img
|
66
121
|
end
|
data/lib/pixelart/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixelart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|
@@ -100,9 +100,9 @@ dependencies:
|
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '3.23'
|
103
|
-
description: pixelart -
|
104
|
-
(in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
105
|
-
email:
|
103
|
+
description: pixelart - yes, you can! generate your own pixel art images (off-blockchain)
|
104
|
+
using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
105
|
+
email: gerald.bauer@gmail.com
|
106
106
|
executables: []
|
107
107
|
extensions: []
|
108
108
|
extra_rdoc_files:
|
@@ -122,8 +122,10 @@ files:
|
|
122
122
|
- lib/pixelart/convert.rb
|
123
123
|
- lib/pixelart/generator.rb
|
124
124
|
- lib/pixelart/image.rb
|
125
|
+
- lib/pixelart/invert.rb
|
125
126
|
- lib/pixelart/led.rb
|
126
127
|
- lib/pixelart/misc.rb
|
128
|
+
- lib/pixelart/orc721/generator.rb
|
127
129
|
- lib/pixelart/pixelator.rb
|
128
130
|
- lib/pixelart/sample.rb
|
129
131
|
- lib/pixelart/silhouette.rb
|
@@ -134,7 +136,7 @@ files:
|
|
134
136
|
- lib/pixelart/ukraine.rb
|
135
137
|
- lib/pixelart/vector.rb
|
136
138
|
- lib/pixelart/version.rb
|
137
|
-
homepage: https://github.com/
|
139
|
+
homepage: https://github.com/learnpixelart/pixelart
|
138
140
|
licenses:
|
139
141
|
- Public Domain
|
140
142
|
metadata: {}
|
@@ -158,6 +160,6 @@ requirements: []
|
|
158
160
|
rubygems_version: 3.3.7
|
159
161
|
signing_key:
|
160
162
|
specification_version: 4
|
161
|
-
summary: pixelart -
|
162
|
-
ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
163
|
+
summary: pixelart - yes, you can! generate your own pixel art images (off-blockchain)
|
164
|
+
using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
163
165
|
test_files: []
|