escpos-image 0.0.9 → 0.0.12
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/.gitlab-ci.yml +1 -0
- data/README.md +25 -5
- data/escpos-image.gemspec +2 -2
- data/examples/IMG_20190225_162935.jpg +0 -0
- data/lib/escpos/errors.rb +6 -2
- data/lib/escpos/image.rb +7 -16
- data/lib/escpos/image_processors/chunky_png.rb +24 -4
- data/lib/escpos/image_processors/mini_magick.rb +15 -8
- data/test/lib/escpos/image_test.rb +13 -11
- data/test/results/test_image.png +0 -0
- data/test/test_helper.rb +0 -1
- metadata +11 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dc80022cd61c7bc3eff82db4ee5d577dd9dc0a31749536ea6e50a9c9305901b6
|
|
4
|
+
data.tar.gz: 2e53ed6568bdc148b20594818a44c4daaf5c7da4850a37e29b0d7ca69d1a605b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1dec2c046d2b46682ab5ddde4bab2ec49b518042a29f0a0db4ae10073aa7440289aa6b4afc83531a29670a1e7132bf02e09b757fe6f5aa81d1616d7deb1132ff
|
|
7
|
+
data.tar.gz: 949bf4644f2674cd62c3d0098f707da79cf8f0f59791d87e395bb65ac1ed52b0a083e57098a4c7227e3716ca0fcbf028c39bdbdb23c937918d72334de3227fce
|
data/.gitlab-ci.yml
CHANGED
data/README.md
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
+
[Build Status](https://gitlab.com/escpos/escpos-image/pipelines)
|
|
2
|
+
|
|
1
3
|
# Escpos-image
|
|
2
4
|
|
|
3
5
|
A ruby implementation of ESC/POS (thermal) printer image command specification.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
|
-
Add this
|
|
9
|
+
Add this lines to your application's Gemfile:
|
|
8
10
|
|
|
9
11
|
```ruby
|
|
10
12
|
gem 'escpos-image'
|
|
13
|
+
|
|
14
|
+
# Depending on chosen image processor
|
|
15
|
+
gem 'mini_magick'
|
|
16
|
+
# or
|
|
17
|
+
gem 'chunky_png'
|
|
11
18
|
```
|
|
12
19
|
|
|
13
20
|
And then execute:
|
|
@@ -18,8 +25,16 @@ Or install it yourself as:
|
|
|
18
25
|
|
|
19
26
|
$ gem install escpos-image
|
|
20
27
|
|
|
28
|
+
And then depending on chosen image processor
|
|
29
|
+
|
|
30
|
+
$ gem install mini_magick
|
|
31
|
+
|
|
32
|
+
or
|
|
33
|
+
|
|
34
|
+
$ gem install chunky_png
|
|
21
35
|
## Examples
|
|
22
36
|
|
|
37
|
+

|
|
23
38
|

|
|
24
39
|
|
|
25
40
|
## Usage
|
|
@@ -29,13 +44,18 @@ Or install it yourself as:
|
|
|
29
44
|
|
|
30
45
|
# Creating image from path
|
|
31
46
|
image = Escpos::Image.new 'path/to/image.png', {
|
|
32
|
-
processor: "ChunkyPng" #
|
|
47
|
+
processor: "ChunkyPng" # or MiniMagick
|
|
33
48
|
# ... other options, see following sections
|
|
34
49
|
}
|
|
35
50
|
|
|
51
|
+
# The ChunkyPng processor requires the chunky_png gem installed
|
|
36
52
|
# The MiniMagick processor requires the mini_magick gem installed
|
|
37
53
|
|
|
38
|
-
# The constructor
|
|
54
|
+
# The constructor accepts an instance of:
|
|
55
|
+
# - String (path to image)
|
|
56
|
+
# - File
|
|
57
|
+
# - ChunkyPNG::Image
|
|
58
|
+
# - MiniMagick::Image
|
|
39
59
|
|
|
40
60
|
@printer << image
|
|
41
61
|
|
|
@@ -51,9 +71,9 @@ image = Escpos::Image.new 'path/to/image.png', {
|
|
|
51
71
|
|
|
52
72
|
| ChunkyPng | MiniMagick |
|
|
53
73
|
| --- | --- |
|
|
54
|
-
| PNG | PNG, JPG, BMP, ... (everything supported by MiniMagick) |
|
|
74
|
+
| PNG | PNG, JPG, GIF, BMP, TIF, PCX, ... (everything supported by MiniMagick) |
|
|
55
75
|
|
|
56
|
-
When using MiniMagick processor, `mini_magick` gem has to be installed or added to the Gemfile, this makes the gem more lightweight by making
|
|
76
|
+
When using `ChunkyPng` processor, `chunky_png` gem has to be installed or added to the Gemfile and when using `MiniMagick` processor, `mini_magick` gem has to be installed or added to the Gemfile, this makes the gem more lightweight by making dependencies optional and based on chosen image processor.
|
|
57
77
|
|
|
58
78
|
## Image manipulation
|
|
59
79
|
|
data/escpos-image.gemspec
CHANGED
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
|
|
25
25
|
spec.add_development_dependency "minitest", "~> 5.4"
|
|
26
26
|
spec.add_development_dependency "mini_magick"
|
|
27
|
+
spec.add_development_dependency "chunky_png"
|
|
27
28
|
|
|
28
|
-
spec.add_dependency "escpos", ">= 0.0.
|
|
29
|
-
spec.add_dependency "chunky_png"
|
|
29
|
+
spec.add_dependency "escpos", ">= 0.0.10"
|
|
30
30
|
end
|
|
Binary file
|
data/lib/escpos/errors.rb
CHANGED
|
@@ -12,9 +12,13 @@ module Escpos
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
class
|
|
15
|
+
class DependencyNotInstalled < LoadError
|
|
16
|
+
attr_reader :dependency_name
|
|
17
|
+
def initialize(dependency_name)
|
|
18
|
+
@dependency_name = dependency_name
|
|
19
|
+
end
|
|
16
20
|
def message
|
|
17
|
-
"Required options need the
|
|
21
|
+
"Required options need the \"#{@dependency_name}\" gem installed."
|
|
18
22
|
end
|
|
19
23
|
end
|
|
20
24
|
|
data/lib/escpos/image.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative "errors"
|
|
2
|
+
require_relative "helpers"
|
|
2
3
|
require_relative "image_processors/chunky_png"
|
|
3
4
|
require_relative "image_processors/mini_magick"
|
|
4
5
|
|
|
@@ -9,39 +10,29 @@ module Escpos
|
|
|
9
10
|
|
|
10
11
|
class Image
|
|
11
12
|
|
|
12
|
-
VERSION = "0.0.
|
|
13
|
+
VERSION = "0.0.12"
|
|
13
14
|
|
|
14
15
|
attr_reader :processor, :options
|
|
15
16
|
|
|
16
17
|
def initialize(image_or_path, options = {})
|
|
17
18
|
@options = options
|
|
18
19
|
|
|
19
|
-
processor_klass_name = options.fetch(:processor
|
|
20
|
+
processor_klass_name = options.fetch(:processor)
|
|
20
21
|
processor_klass = ImageProcessors.const_get(processor_klass_name)
|
|
21
22
|
@processor = processor_klass.new image_or_path, options
|
|
22
23
|
|
|
23
24
|
@processor.process!
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
def chunky_png_image
|
|
27
|
-
processor.chunky_png_image
|
|
28
|
-
end
|
|
29
|
-
|
|
30
27
|
def to_escpos
|
|
31
28
|
bits = []
|
|
32
29
|
mask = 0x80
|
|
33
30
|
i = 0
|
|
34
31
|
temp = 0
|
|
35
32
|
|
|
36
|
-
0.upto(
|
|
37
|
-
0.upto(
|
|
38
|
-
px =
|
|
39
|
-
r, g, b =
|
|
40
|
-
ChunkyPNG::Color.r(px),
|
|
41
|
-
ChunkyPNG::Color.g(px),
|
|
42
|
-
ChunkyPNG::Color.b(px)
|
|
43
|
-
|
|
44
|
-
px = (r + b + g) / 3
|
|
33
|
+
0.upto(processor.image.height - 1) do |y|
|
|
34
|
+
0.upto(processor.image.width - 1) do |x|
|
|
35
|
+
px = processor.get_pixel(x, y)
|
|
45
36
|
value = px >= 128 ? 255 : 0
|
|
46
37
|
value = (value << 8) | value
|
|
47
38
|
temp |= mask if value == 0
|
|
@@ -58,7 +49,7 @@ module Escpos
|
|
|
58
49
|
|
|
59
50
|
[
|
|
60
51
|
Escpos.sequence(IMAGE),
|
|
61
|
-
[
|
|
52
|
+
[ processor.image.width / 8, processor.image.height ].pack("SS"),
|
|
62
53
|
bits.pack("C*")
|
|
63
54
|
].join
|
|
64
55
|
end
|
|
@@ -5,9 +5,13 @@ module Escpos
|
|
|
5
5
|
class ChunkyPng < Base
|
|
6
6
|
|
|
7
7
|
def initialize(image_or_path, options = {})
|
|
8
|
+
require_chunky_png!
|
|
9
|
+
|
|
8
10
|
@image = begin
|
|
9
11
|
if image_or_path.is_a?(ChunkyPNG::Image)
|
|
10
12
|
image_or_path
|
|
13
|
+
elsif image_or_path.is_a?(File)
|
|
14
|
+
ChunkyPNG::Image.from_file(image_or_path.path)
|
|
11
15
|
elsif image_or_path.is_a?(String)
|
|
12
16
|
ChunkyPNG::Image.from_file(image_or_path)
|
|
13
17
|
else
|
|
@@ -18,14 +22,30 @@ module Escpos
|
|
|
18
22
|
super
|
|
19
23
|
end
|
|
20
24
|
|
|
21
|
-
def chunky_png_image
|
|
22
|
-
@image
|
|
23
|
-
end
|
|
24
|
-
|
|
25
25
|
def assert_options!
|
|
26
26
|
assert_dimensions_multiple_of_8!
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
+
# ChunkyPng gem is not required intentionally
|
|
30
|
+
# This makes the gem more lightweight by making dependencies
|
|
31
|
+
# optional and based on chosen image processor
|
|
32
|
+
def require_chunky_png!
|
|
33
|
+
return if defined?(::ChunkyPng)
|
|
34
|
+
require "chunky_png"
|
|
35
|
+
rescue LoadError => e
|
|
36
|
+
raise DependencyNotInstalled.new("chunky_png")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get_pixel(x, y)
|
|
40
|
+
px = image.get_pixel x, y
|
|
41
|
+
r, g, b =
|
|
42
|
+
ChunkyPNG::Color.r(px),
|
|
43
|
+
ChunkyPNG::Color.g(px),
|
|
44
|
+
ChunkyPNG::Color.b(px)
|
|
45
|
+
|
|
46
|
+
(r + b + g) / 3
|
|
47
|
+
end
|
|
48
|
+
|
|
29
49
|
def process!
|
|
30
50
|
extent = options.fetch(:extent, false)
|
|
31
51
|
compose_alpha = options.fetch(:compose_alpha, false)
|
|
@@ -10,6 +10,8 @@ module Escpos
|
|
|
10
10
|
@image = begin
|
|
11
11
|
if image_or_path.is_a?(::MiniMagick::Image)
|
|
12
12
|
image_or_path
|
|
13
|
+
elsif image_or_path.is_a?(File)
|
|
14
|
+
::MiniMagick::Image.open(image_or_path.path)
|
|
13
15
|
elsif image_or_path.is_a?(String)
|
|
14
16
|
::MiniMagick::Image.open(image_or_path)
|
|
15
17
|
else
|
|
@@ -20,8 +22,15 @@ module Escpos
|
|
|
20
22
|
super
|
|
21
23
|
end
|
|
22
24
|
|
|
23
|
-
def
|
|
24
|
-
@
|
|
25
|
+
def get_pixel(x, y)
|
|
26
|
+
@pixels ||= image.get_pixels
|
|
27
|
+
|
|
28
|
+
r, g, b =
|
|
29
|
+
@pixels[y][x][0],
|
|
30
|
+
@pixels[y][x][1],
|
|
31
|
+
@pixels[y][x][2]
|
|
32
|
+
|
|
33
|
+
(r + b + g) / 3
|
|
25
34
|
end
|
|
26
35
|
|
|
27
36
|
def assert_options!
|
|
@@ -29,12 +38,13 @@ module Escpos
|
|
|
29
38
|
end
|
|
30
39
|
|
|
31
40
|
# MiniMagick gem is not required intentionally
|
|
32
|
-
# This makes the gem more lightweight by making
|
|
41
|
+
# This makes the gem more lightweight by making dependencies
|
|
42
|
+
# optional and based on chosen image processor
|
|
33
43
|
def require_mini_magick!
|
|
34
44
|
return if defined?(::MiniMagick)
|
|
35
45
|
require "mini_magick"
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
rescue LoadError => e
|
|
47
|
+
raise DependencyNotInstalled.new("mini_magick")
|
|
38
48
|
end
|
|
39
49
|
|
|
40
50
|
def process!
|
|
@@ -70,9 +80,6 @@ module Escpos
|
|
|
70
80
|
if options.fetch(:extent, false)
|
|
71
81
|
image.extent "#{(image.width/8.0).round*8}x#{(image.height/8.0).round*8}"
|
|
72
82
|
end
|
|
73
|
-
|
|
74
|
-
# Force PNG format so ChunkyPNG works
|
|
75
|
-
image.format 'png'
|
|
76
83
|
end
|
|
77
84
|
|
|
78
85
|
end
|
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
require_relative '../../test_helper'
|
|
2
2
|
|
|
3
3
|
class ImageTest < Minitest::Test
|
|
4
|
+
|
|
4
5
|
def setup
|
|
5
6
|
@printer = Escpos::Printer.new
|
|
6
7
|
end
|
|
7
8
|
|
|
8
|
-
# TODO photos of results
|
|
9
|
-
# TODO USB with option print tests (dev dependency)
|
|
10
|
-
|
|
11
9
|
def test_image
|
|
12
10
|
image_path = File.join(__dir__, '../../fixtures/tux_mono.png')
|
|
13
|
-
|
|
11
|
+
image_file = File.new image_path
|
|
12
|
+
image = Escpos::Image.new image_file,
|
|
14
13
|
processor: "MiniMagick"
|
|
14
|
+
image_file.close
|
|
15
15
|
|
|
16
16
|
@printer << image
|
|
17
17
|
@printer << "\n" * 10
|
|
18
18
|
@printer.cut!
|
|
19
|
-
image.
|
|
20
|
-
image.chunky_png_image.save(File.join(__dir__, "../../results/#{__method__}.png"))
|
|
19
|
+
image.processor.image.write(File.join(__dir__, "../../results/#{__method__}.png"))
|
|
21
20
|
file = File.join(__dir__, "../../results/#{__method__}.txt")
|
|
22
|
-
|
|
21
|
+
#@printer.save file
|
|
22
|
+
|
|
23
23
|
assert_equal IO.binread(file), @printer.to_escpos
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def test_image_conversion
|
|
27
27
|
image_path = File.join(__dir__, '../../fixtures/tux_alpha.png')
|
|
28
28
|
image = Escpos::Image.new image_path, grayscale: true,
|
|
29
|
-
compose_alpha: true, extent: true
|
|
29
|
+
compose_alpha: true, extent: true,
|
|
30
|
+
processor: "ChunkyPng"
|
|
30
31
|
|
|
31
32
|
@printer << image.to_escpos
|
|
32
33
|
@printer << "\n" * 10
|
|
33
34
|
@printer.cut!
|
|
34
|
-
image.
|
|
35
|
-
image.
|
|
35
|
+
image.processor.image.metadata = {}
|
|
36
|
+
image.processor.image.save(File.join(__dir__, "../../results/#{__method__}.png"))
|
|
36
37
|
file = File.join(__dir__, "../../results/#{__method__}.txt")
|
|
37
|
-
|
|
38
|
+
#@printer.save file
|
|
39
|
+
|
|
38
40
|
assert_equal IO.binread(file), @printer.to_escpos
|
|
39
41
|
end
|
|
40
42
|
|
data/test/results/test_image.png
CHANGED
|
Binary file
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: escpos-image
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jan Svoboda
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-09-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -67,33 +67,33 @@ dependencies:
|
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
70
|
+
name: chunky_png
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - ">="
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0
|
|
76
|
-
type: :
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - ">="
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: 0
|
|
82
|
+
version: '0'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
84
|
+
name: escpos
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - ">="
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
89
|
+
version: 0.0.10
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - ">="
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
96
|
+
version: 0.0.10
|
|
97
97
|
description: A ruby implementation of ESC/POS (thermal) printer image command specification.
|
|
98
98
|
email:
|
|
99
99
|
- jan@mluv.cz
|
|
@@ -112,6 +112,7 @@ files:
|
|
|
112
112
|
- bin/setup
|
|
113
113
|
- escpos-image.gemspec
|
|
114
114
|
- examples/IMG_20160610_232415_HDR.jpg
|
|
115
|
+
- examples/IMG_20190225_162935.jpg
|
|
115
116
|
- lib/escpos/errors.rb
|
|
116
117
|
- lib/escpos/helpers.rb
|
|
117
118
|
- lib/escpos/image.rb
|
|
@@ -145,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
145
146
|
- !ruby/object:Gem::Version
|
|
146
147
|
version: '0'
|
|
147
148
|
requirements: []
|
|
148
|
-
rubygems_version: 3.
|
|
149
|
+
rubygems_version: 3.1.2
|
|
149
150
|
signing_key:
|
|
150
151
|
specification_version: 4
|
|
151
152
|
summary: A ruby implementation of ESC/POS (thermal) printer image command specification.
|