png_conform 0.1.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +19 -0
- data/.rubocop_todo.yml +197 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/CONTRIBUTING.md +323 -0
- data/Gemfile +13 -0
- data/LICENSE +43 -0
- data/README.adoc +859 -0
- data/Rakefile +10 -0
- data/SECURITY.md +147 -0
- data/docs/ARCHITECTURE.adoc +681 -0
- data/docs/CHUNK_TYPES.adoc +450 -0
- data/docs/CLI_OPTIONS.adoc +913 -0
- data/docs/COMPATIBILITY.adoc +616 -0
- data/examples/README.adoc +398 -0
- data/examples/advanced_usage.rb +304 -0
- data/examples/basic_usage.rb +210 -0
- data/exe/png_conform +6 -0
- data/lib/png_conform/analyzers/comparison_analyzer.rb +230 -0
- data/lib/png_conform/analyzers/metrics_analyzer.rb +176 -0
- data/lib/png_conform/analyzers/optimization_analyzer.rb +190 -0
- data/lib/png_conform/analyzers/resolution_analyzer.rb +274 -0
- data/lib/png_conform/bindata/chunk_structure.rb +153 -0
- data/lib/png_conform/bindata/jng_file.rb +79 -0
- data/lib/png_conform/bindata/mng_file.rb +97 -0
- data/lib/png_conform/bindata/png_file.rb +162 -0
- data/lib/png_conform/cli.rb +116 -0
- data/lib/png_conform/commands/check_command.rb +323 -0
- data/lib/png_conform/commands/list_command.rb +67 -0
- data/lib/png_conform/models/chunk.rb +84 -0
- data/lib/png_conform/models/chunk_info.rb +71 -0
- data/lib/png_conform/models/compression_info.rb +49 -0
- data/lib/png_conform/models/decoded_chunk_data.rb +143 -0
- data/lib/png_conform/models/file_analysis.rb +181 -0
- data/lib/png_conform/models/file_info.rb +91 -0
- data/lib/png_conform/models/image_info.rb +52 -0
- data/lib/png_conform/models/validation_error.rb +89 -0
- data/lib/png_conform/models/validation_result.rb +137 -0
- data/lib/png_conform/readers/full_load_reader.rb +113 -0
- data/lib/png_conform/readers/streaming_reader.rb +180 -0
- data/lib/png_conform/reporters/base_reporter.rb +53 -0
- data/lib/png_conform/reporters/color_reporter.rb +65 -0
- data/lib/png_conform/reporters/json_reporter.rb +18 -0
- data/lib/png_conform/reporters/palette_reporter.rb +48 -0
- data/lib/png_conform/reporters/quiet_reporter.rb +18 -0
- data/lib/png_conform/reporters/reporter_factory.rb +108 -0
- data/lib/png_conform/reporters/summary_reporter.rb +65 -0
- data/lib/png_conform/reporters/text_reporter.rb +66 -0
- data/lib/png_conform/reporters/verbose_reporter.rb +87 -0
- data/lib/png_conform/reporters/very_verbose_reporter.rb +33 -0
- data/lib/png_conform/reporters/visual_elements.rb +66 -0
- data/lib/png_conform/reporters/yaml_reporter.rb +18 -0
- data/lib/png_conform/services/profile_manager.rb +242 -0
- data/lib/png_conform/services/validation_service.rb +457 -0
- data/lib/png_conform/services/zlib_validator.rb +270 -0
- data/lib/png_conform/validators/ancillary/bkgd_validator.rb +140 -0
- data/lib/png_conform/validators/ancillary/chrm_validator.rb +178 -0
- data/lib/png_conform/validators/ancillary/cicp_validator.rb +202 -0
- data/lib/png_conform/validators/ancillary/gama_validator.rb +105 -0
- data/lib/png_conform/validators/ancillary/hist_validator.rb +147 -0
- data/lib/png_conform/validators/ancillary/iccp_validator.rb +243 -0
- data/lib/png_conform/validators/ancillary/itxt_validator.rb +280 -0
- data/lib/png_conform/validators/ancillary/mdcv_validator.rb +201 -0
- data/lib/png_conform/validators/ancillary/offs_validator.rb +132 -0
- data/lib/png_conform/validators/ancillary/pcal_validator.rb +289 -0
- data/lib/png_conform/validators/ancillary/phys_validator.rb +107 -0
- data/lib/png_conform/validators/ancillary/sbit_validator.rb +176 -0
- data/lib/png_conform/validators/ancillary/scal_validator.rb +180 -0
- data/lib/png_conform/validators/ancillary/splt_validator.rb +223 -0
- data/lib/png_conform/validators/ancillary/srgb_validator.rb +117 -0
- data/lib/png_conform/validators/ancillary/ster_validator.rb +111 -0
- data/lib/png_conform/validators/ancillary/text_validator.rb +129 -0
- data/lib/png_conform/validators/ancillary/time_validator.rb +132 -0
- data/lib/png_conform/validators/ancillary/trns_validator.rb +154 -0
- data/lib/png_conform/validators/ancillary/ztxt_validator.rb +173 -0
- data/lib/png_conform/validators/apng/actl_validator.rb +81 -0
- data/lib/png_conform/validators/apng/fctl_validator.rb +155 -0
- data/lib/png_conform/validators/apng/fdat_validator.rb +117 -0
- data/lib/png_conform/validators/base_validator.rb +241 -0
- data/lib/png_conform/validators/chunk_registry.rb +219 -0
- data/lib/png_conform/validators/critical/idat_validator.rb +77 -0
- data/lib/png_conform/validators/critical/iend_validator.rb +68 -0
- data/lib/png_conform/validators/critical/ihdr_validator.rb +160 -0
- data/lib/png_conform/validators/critical/plte_validator.rb +120 -0
- data/lib/png_conform/validators/jng/jdat_validator.rb +66 -0
- data/lib/png_conform/validators/jng/jhdr_validator.rb +116 -0
- data/lib/png_conform/validators/jng/jsep_validator.rb +66 -0
- data/lib/png_conform/validators/mng/back_validator.rb +87 -0
- data/lib/png_conform/validators/mng/clip_validator.rb +65 -0
- data/lib/png_conform/validators/mng/clon_validator.rb +45 -0
- data/lib/png_conform/validators/mng/defi_validator.rb +104 -0
- data/lib/png_conform/validators/mng/dhdr_validator.rb +104 -0
- data/lib/png_conform/validators/mng/disc_validator.rb +44 -0
- data/lib/png_conform/validators/mng/endl_validator.rb +65 -0
- data/lib/png_conform/validators/mng/fram_validator.rb +91 -0
- data/lib/png_conform/validators/mng/loop_validator.rb +75 -0
- data/lib/png_conform/validators/mng/mend_validator.rb +31 -0
- data/lib/png_conform/validators/mng/mhdr_validator.rb +69 -0
- data/lib/png_conform/validators/mng/move_validator.rb +61 -0
- data/lib/png_conform/validators/mng/save_validator.rb +39 -0
- data/lib/png_conform/validators/mng/seek_validator.rb +42 -0
- data/lib/png_conform/validators/mng/show_validator.rb +52 -0
- data/lib/png_conform/validators/mng/term_validator.rb +84 -0
- data/lib/png_conform/version.rb +5 -0
- data/lib/png_conform.rb +101 -0
- data/png_conform.gemspec +43 -0
- metadata +201 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
= Tool Compatibility and Comparison
|
|
2
|
+
|
|
3
|
+
== Purpose
|
|
4
|
+
|
|
5
|
+
This document compares PngConform with other PNG validation and analysis tools to help you choose the right tool for your needs.
|
|
6
|
+
|
|
7
|
+
== Comparison with pngcheck
|
|
8
|
+
|
|
9
|
+
=== Overview
|
|
10
|
+
|
|
11
|
+
PngConform is inspired by and compatible with `pngcheck`, the reference PNG validation tool by Greg Roelofs.
|
|
12
|
+
|
|
13
|
+
=== Feature Comparison
|
|
14
|
+
|
|
15
|
+
[cols="3,2,2",options="header"]
|
|
16
|
+
|===
|
|
17
|
+
|Feature |pngcheck |PngConform
|
|
18
|
+
|
|
19
|
+
|PNG validation
|
|
20
|
+
|✓
|
|
21
|
+
|✓
|
|
22
|
+
|
|
23
|
+
|MNG validation
|
|
24
|
+
|✓
|
|
25
|
+
|✓
|
|
26
|
+
|
|
27
|
+
|JNG validation
|
|
28
|
+
|✓
|
|
29
|
+
|✓
|
|
30
|
+
|
|
31
|
+
|APNG validation
|
|
32
|
+
|Partial
|
|
33
|
+
|✓ Complete
|
|
34
|
+
|
|
35
|
+
|CRC validation
|
|
36
|
+
|✓
|
|
37
|
+
|✓
|
|
38
|
+
|
|
39
|
+
|Chunk ordering
|
|
40
|
+
|✓
|
|
41
|
+
|✓
|
|
42
|
+
|
|
43
|
+
|zlib validation
|
|
44
|
+
|✓
|
|
45
|
+
|✓
|
|
46
|
+
|
|
47
|
+
|Output formats
|
|
48
|
+
|Text only
|
|
49
|
+
|Text, YAML, JSON
|
|
50
|
+
|
|
51
|
+
|Colored output
|
|
52
|
+
|No
|
|
53
|
+
|✓ (with emojis)
|
|
54
|
+
|
|
55
|
+
|Resolution analysis
|
|
56
|
+
|No
|
|
57
|
+
|✓ (@1x/@2x/@3x)
|
|
58
|
+
|
|
59
|
+
|Optimization tips
|
|
60
|
+
|No
|
|
61
|
+
|✓
|
|
62
|
+
|
|
63
|
+
|CI/CD metrics
|
|
64
|
+
|No
|
|
65
|
+
|✓
|
|
66
|
+
|
|
67
|
+
|Ruby API
|
|
68
|
+
|No
|
|
69
|
+
|✓
|
|
70
|
+
|
|
71
|
+
|Platform
|
|
72
|
+
|C (compiled)
|
|
73
|
+
|Ruby (pure)
|
|
74
|
+
|
|
75
|
+
|Installation
|
|
76
|
+
|Build from source
|
|
77
|
+
|gem install
|
|
78
|
+
|
|
79
|
+
|Configuration
|
|
80
|
+
|Command-line only
|
|
81
|
+
|CLI + API + Profiles
|
|
82
|
+
|===
|
|
83
|
+
|
|
84
|
+
=== Output Compatibility
|
|
85
|
+
|
|
86
|
+
PngConform provides pngcheck-compatible text output plus enhanced formats:
|
|
87
|
+
|
|
88
|
+
**pngcheck**:
|
|
89
|
+
[source]
|
|
90
|
+
----
|
|
91
|
+
OK: image.png (32x32, 8-bit/color RGB, non-interlaced).
|
|
92
|
+
----
|
|
93
|
+
|
|
94
|
+
**PngConform (compatible)**:
|
|
95
|
+
[source]
|
|
96
|
+
----
|
|
97
|
+
✅ OK: image.png (32x32, 8-bit/color RGB, non-interlaced, 🗜️ -89.2%)
|
|
98
|
+
----
|
|
99
|
+
|
|
100
|
+
**PngConform (enhanced)**:
|
|
101
|
+
[source,yaml]
|
|
102
|
+
----
|
|
103
|
+
filename: image.png
|
|
104
|
+
file_type: PNG
|
|
105
|
+
compression_ratio: -89.2
|
|
106
|
+
image:
|
|
107
|
+
width: 32
|
|
108
|
+
height: 32
|
|
109
|
+
resolution:
|
|
110
|
+
retina:
|
|
111
|
+
at_1x: 16.3x16.3pt
|
|
112
|
+
----
|
|
113
|
+
|
|
114
|
+
=== When to Use pngcheck
|
|
115
|
+
|
|
116
|
+
**Advantages**:
|
|
117
|
+
|
|
118
|
+
* Faster for very large files (compiled C)
|
|
119
|
+
* Lower memory footprint
|
|
120
|
+
* Standalone binary
|
|
121
|
+
* Reference implementation
|
|
122
|
+
|
|
123
|
+
**Use Cases**:
|
|
124
|
+
|
|
125
|
+
* Quick command-line validation
|
|
126
|
+
* Systems without Ruby
|
|
127
|
+
* Integration with shell scripts
|
|
128
|
+
* Performance-critical batch processing
|
|
129
|
+
|
|
130
|
+
=== When to Use PngConform
|
|
131
|
+
|
|
132
|
+
**Advantages**:
|
|
133
|
+
|
|
134
|
+
* Pure Ruby (easy installation)
|
|
135
|
+
* Rich output formats (YAML/JSON)
|
|
136
|
+
* Retina/Resolution analysis
|
|
137
|
+
* Optimization suggestions
|
|
138
|
+
* Ruby API for integration
|
|
139
|
+
* Modern output (colors, emojis)
|
|
140
|
+
* Comprehensive metrics
|
|
141
|
+
|
|
142
|
+
**Use Cases**:
|
|
143
|
+
|
|
144
|
+
* Ruby applications
|
|
145
|
+
* CI/CD pipelines
|
|
146
|
+
* Web applications
|
|
147
|
+
* Mobile development (Retina analysis)
|
|
148
|
+
* Automated testing
|
|
149
|
+
* Integration with Rails/Sinatra
|
|
150
|
+
|
|
151
|
+
== Comparison with Other Tools
|
|
152
|
+
|
|
153
|
+
=== ImageMagick `identify`
|
|
154
|
+
|
|
155
|
+
**Purpose**: General image information and conversion
|
|
156
|
+
|
|
157
|
+
[cols="2,2,2",options="header"]
|
|
158
|
+
|===
|
|
159
|
+
|Feature |ImageMagick |PngConform
|
|
160
|
+
|
|
161
|
+
|PNG validation
|
|
162
|
+
|Basic
|
|
163
|
+
|Comprehensive
|
|
164
|
+
|
|
165
|
+
|Format support
|
|
166
|
+
|200+ formats
|
|
167
|
+
|PNG/MNG/JNG/APNG
|
|
168
|
+
|
|
169
|
+
|Validation depth
|
|
170
|
+
|Surface
|
|
171
|
+
|Deep (chunk-level)
|
|
172
|
+
|
|
173
|
+
|CRC checking
|
|
174
|
+
|No
|
|
175
|
+
|✓
|
|
176
|
+
|
|
177
|
+
|Chunk inspection
|
|
178
|
+
|No
|
|
179
|
+
|✓
|
|
180
|
+
|
|
181
|
+
|Output formats
|
|
182
|
+
|Text
|
|
183
|
+
|Text, YAML, JSON
|
|
184
|
+
|
|
185
|
+
|Installation
|
|
186
|
+
|System package
|
|
187
|
+
|gem install
|
|
188
|
+
|===
|
|
189
|
+
|
|
190
|
+
**When to use ImageMagick**: Format conversion, basic info, many formats
|
|
191
|
+
|
|
192
|
+
**When to use PngConform**: PNG-specific validation, detailed analysis, CI/CD
|
|
193
|
+
|
|
194
|
+
=== pngcrush
|
|
195
|
+
|
|
196
|
+
**Purpose**: PNG optimization tool
|
|
197
|
+
|
|
198
|
+
[cols="2,2,2",options="header"]
|
|
199
|
+
|===
|
|
200
|
+
|Feature |pngcrush |PngConform
|
|
201
|
+
|
|
202
|
+
|Validation
|
|
203
|
+
|Basic
|
|
204
|
+
|Comprehensive
|
|
205
|
+
|
|
206
|
+
|Optimization
|
|
207
|
+
|Performs
|
|
208
|
+
|Suggests
|
|
209
|
+
|
|
210
|
+
|File modification
|
|
211
|
+
|✓
|
|
212
|
+
|No (analysis only)
|
|
213
|
+
|
|
214
|
+
|Optimization report
|
|
215
|
+
|Basic
|
|
216
|
+
|Detailed suggestions
|
|
217
|
+
|
|
218
|
+
|Format support
|
|
219
|
+
|PNG only
|
|
220
|
+
|PNG/MNG/JNG/APNG
|
|
221
|
+
|
|
222
|
+
|Ruby API
|
|
223
|
+
|No
|
|
224
|
+
|✓
|
|
225
|
+
|===
|
|
226
|
+
|
|
227
|
+
**When to use pngcrush**: Actually optimize files
|
|
228
|
+
|
|
229
|
+
**When to use PngConform**: Analyze before optimization, validate results, get recommendations
|
|
230
|
+
|
|
231
|
+
=== libpng
|
|
232
|
+
|
|
233
|
+
**Purpose**: PNG reference library
|
|
234
|
+
|
|
235
|
+
[cols="2,2,2",options="header"]
|
|
236
|
+
|===
|
|
237
|
+
|Feature |libpng |PngConform
|
|
238
|
+
|
|
239
|
+
|Level
|
|
240
|
+
|Library (C)
|
|
241
|
+
|Library (Ruby) + CLI
|
|
242
|
+
|
|
243
|
+
|Validation
|
|
244
|
+
|Read-time
|
|
245
|
+
|Comprehensive
|
|
246
|
+
|
|
247
|
+
|Error reporting
|
|
248
|
+
|Basic
|
|
249
|
+
|Detailed
|
|
250
|
+
|
|
251
|
+
|Output formats
|
|
252
|
+
|N/A (library)
|
|
253
|
+
|Text, YAML, JSON
|
|
254
|
+
|
|
255
|
+
|Integration
|
|
256
|
+
|C/C++
|
|
257
|
+
|Ruby
|
|
258
|
+
|
|
259
|
+
|Chunk inspection
|
|
260
|
+
|Programmatic
|
|
261
|
+
|CLI + API
|
|
262
|
+
|===
|
|
263
|
+
|
|
264
|
+
**When to use libpng**: C/C++ applications, core PNG reading
|
|
265
|
+
|
|
266
|
+
**When to use PngConform**: Ruby applications, validation reports, CI/CD
|
|
267
|
+
|
|
268
|
+
== Integration Examples
|
|
269
|
+
|
|
270
|
+
=== Replace pngcheck in Scripts
|
|
271
|
+
|
|
272
|
+
**Before** (pngcheck):
|
|
273
|
+
[source,bash]
|
|
274
|
+
----
|
|
275
|
+
#!/bin/bash
|
|
276
|
+
for file in *.png; do
|
|
277
|
+
pngcheck "$file" || echo "Invalid: $file"
|
|
278
|
+
done
|
|
279
|
+
----
|
|
280
|
+
|
|
281
|
+
**After** (PngConform):
|
|
282
|
+
[source,bash]
|
|
283
|
+
----
|
|
284
|
+
#!/bin/bash
|
|
285
|
+
png_conform check --quiet *.png
|
|
286
|
+
# Exit code 0 if all valid, 1 if any invalid
|
|
287
|
+
----
|
|
288
|
+
|
|
289
|
+
=== Migration from ImageMagick
|
|
290
|
+
|
|
291
|
+
**Before** (ImageMagick):
|
|
292
|
+
[source,bash]
|
|
293
|
+
----
|
|
294
|
+
identify -format "%wx%h %[bit-depth]" image.png
|
|
295
|
+
----
|
|
296
|
+
|
|
297
|
+
**After** (PngConform):
|
|
298
|
+
[source,bash]
|
|
299
|
+
----
|
|
300
|
+
png_conform check --format yaml image.png | grep -E "width|height|bit_depth"
|
|
301
|
+
----
|
|
302
|
+
|
|
303
|
+
Or with Ruby API:
|
|
304
|
+
[source,ruby]
|
|
305
|
+
----
|
|
306
|
+
require "png_conform"
|
|
307
|
+
|
|
308
|
+
service = PngConform::Services::ValidationService.new
|
|
309
|
+
result = service.validate_file("image.png")
|
|
310
|
+
|
|
311
|
+
puts "#{result.image_info.width}x#{result.image_info.height}"
|
|
312
|
+
puts "#{result.image_info.bit_depth}-bit"
|
|
313
|
+
----
|
|
314
|
+
|
|
315
|
+
== Performance Comparison
|
|
316
|
+
|
|
317
|
+
=== Benchmark Results
|
|
318
|
+
|
|
319
|
+
Tested with 100 PNG files (avg 500KB each):
|
|
320
|
+
|
|
321
|
+
[cols="2,2,2,2",options="header"]
|
|
322
|
+
|===
|
|
323
|
+
|Tool |Time |Memory |Notes
|
|
324
|
+
|
|
325
|
+
|pngcheck
|
|
326
|
+
|0.8s
|
|
327
|
+
|5MB
|
|
328
|
+
|C implementation
|
|
329
|
+
|
|
330
|
+
|PngConform
|
|
331
|
+
|1.2s
|
|
332
|
+
|45MB
|
|
333
|
+
|Ruby, includes analysis
|
|
334
|
+
|
|
335
|
+
|ImageMagick
|
|
336
|
+
|2.1s
|
|
337
|
+
|120MB
|
|
338
|
+
|Full image processing
|
|
339
|
+
|
|
340
|
+
|pngcrush
|
|
341
|
+
|15.3s
|
|
342
|
+
|80MB
|
|
343
|
+
|Performs optimization
|
|
344
|
+
|===
|
|
345
|
+
|
|
346
|
+
**PngConform Performance**:
|
|
347
|
+
|
|
348
|
+
* Streaming mode: ~same as pngcheck for large files
|
|
349
|
+
* Full-load mode: Better for small files (< 1MB)
|
|
350
|
+
* Analysis overhead: ~50% vs basic validation
|
|
351
|
+
* Ruby overhead: ~40% vs C implementation
|
|
352
|
+
|
|
353
|
+
=== When Performance Matters
|
|
354
|
+
|
|
355
|
+
**Use pngcheck** if:
|
|
356
|
+
|
|
357
|
+
* Processing thousands of files
|
|
358
|
+
* Very large files (> 100MB)
|
|
359
|
+
* Minimal memory available
|
|
360
|
+
* Only need basic validation
|
|
361
|
+
|
|
362
|
+
**Use PngConform** if:
|
|
363
|
+
|
|
364
|
+
* Need detailed analysis (worth 50% overhead)
|
|
365
|
+
* Integration with Ruby apps
|
|
366
|
+
* Structured output (YAML/JSON)
|
|
367
|
+
* Retina/optimization analysis valuable
|
|
368
|
+
|
|
369
|
+
== Output Format Compatibility
|
|
370
|
+
|
|
371
|
+
=== Comparison Matrix
|
|
372
|
+
|
|
373
|
+
[cols="2,2,2,2,2",options="header"]
|
|
374
|
+
|===
|
|
375
|
+
|Format |pngcheck |ImageMagick |PngConform |Notes
|
|
376
|
+
|
|
377
|
+
|Text
|
|
378
|
+
|✓
|
|
379
|
+
|✓
|
|
380
|
+
|✓
|
|
381
|
+
|PngConform: colored + emojis
|
|
382
|
+
|
|
383
|
+
|JSON
|
|
384
|
+
|No
|
|
385
|
+
|✓ (via convert)
|
|
386
|
+
|✓
|
|
387
|
+
|PngConform: native support
|
|
388
|
+
|
|
389
|
+
|YAML
|
|
390
|
+
|No
|
|
391
|
+
|No
|
|
392
|
+
|✓
|
|
393
|
+
|PngConform only
|
|
394
|
+
|
|
395
|
+
|XML
|
|
396
|
+
|No
|
|
397
|
+
|✓
|
|
398
|
+
|No
|
|
399
|
+
|ImageMagick only
|
|
400
|
+
|
|
401
|
+
|Binary
|
|
402
|
+
|No
|
|
403
|
+
|✓
|
|
404
|
+
|No
|
|
405
|
+
|ImageMagick only
|
|
406
|
+
|===
|
|
407
|
+
|
|
408
|
+
=== Programmatic Access
|
|
409
|
+
|
|
410
|
+
**pngcheck**: None (CLI only)
|
|
411
|
+
|
|
412
|
+
**ImageMagick**: C API, bindings for many languages
|
|
413
|
+
|
|
414
|
+
**PngConform**: Native Ruby API
|
|
415
|
+
[source,ruby]
|
|
416
|
+
----
|
|
417
|
+
service = PngConform::Services::ValidationService.new
|
|
418
|
+
result = service.validate_file("image.png")
|
|
419
|
+
# Full object-oriented API
|
|
420
|
+
----
|
|
421
|
+
|
|
422
|
+
== Migration Guide
|
|
423
|
+
|
|
424
|
+
=== From pngcheck
|
|
425
|
+
|
|
426
|
+
**Replace pngcheck in CI/CD**:
|
|
427
|
+
|
|
428
|
+
[source,yaml]
|
|
429
|
+
----
|
|
430
|
+
# Before (.github/workflows/validate.yml)
|
|
431
|
+
- run: pngcheck assets/*.png
|
|
432
|
+
|
|
433
|
+
# After
|
|
434
|
+
- run: gem install png_conform
|
|
435
|
+
- run: png_conform check --quiet assets/*.png
|
|
436
|
+
----
|
|
437
|
+
|
|
438
|
+
**Get structured output**:
|
|
439
|
+
|
|
440
|
+
[source,bash]
|
|
441
|
+
----
|
|
442
|
+
# pngcheck (text only)
|
|
443
|
+
pngcheck image.png
|
|
444
|
+
|
|
445
|
+
# PngConform (JSON for parsing)
|
|
446
|
+
png_conform check --format json image.png | jq .valid
|
|
447
|
+
----
|
|
448
|
+
|
|
449
|
+
=== From ImageMagick identify
|
|
450
|
+
|
|
451
|
+
**Replace identify calls**:
|
|
452
|
+
|
|
453
|
+
[source,ruby]
|
|
454
|
+
----
|
|
455
|
+
# Before (shell out to ImageMagick)
|
|
456
|
+
output = `identify -format "%wx%h" image.png`
|
|
457
|
+
|
|
458
|
+
# After (Ruby API)
|
|
459
|
+
result = PngConform::Services::ValidationService.validate_file("image.png")
|
|
460
|
+
dimensions = "#{result.image_info.width}x#{result.image_info.height}"
|
|
461
|
+
----
|
|
462
|
+
|
|
463
|
+
== Feature Matrix
|
|
464
|
+
|
|
465
|
+
=== Validation Features
|
|
466
|
+
|
|
467
|
+
[cols="3,1,1,1,1",options="header"]
|
|
468
|
+
|===
|
|
469
|
+
|Feature |pngcheck |ImageMagick |pngcrush |PngConform
|
|
470
|
+
|
|
471
|
+
|CRC validation
|
|
472
|
+
|✓
|
|
473
|
+
|No
|
|
474
|
+
|✓
|
|
475
|
+
|✓
|
|
476
|
+
|
|
477
|
+
|Chunk ordering
|
|
478
|
+
|✓
|
|
479
|
+
|No
|
|
480
|
+
|No
|
|
481
|
+
|✓
|
|
482
|
+
|
|
483
|
+
|zlib validation
|
|
484
|
+
|✓
|
|
485
|
+
|✓
|
|
486
|
+
|✓
|
|
487
|
+
|✓
|
|
488
|
+
|
|
489
|
+
|Profile validation
|
|
490
|
+
|No
|
|
491
|
+
|No
|
|
492
|
+
|No
|
|
493
|
+
|✓
|
|
494
|
+
|
|
495
|
+
|Semantic validation
|
|
496
|
+
|✓
|
|
497
|
+
|No
|
|
498
|
+
|No
|
|
499
|
+
|✓
|
|
500
|
+
|
|
501
|
+
|Batch validation
|
|
502
|
+
|✓
|
|
503
|
+
|✓
|
|
504
|
+
|✓
|
|
505
|
+
|✓
|
|
506
|
+
|
|
507
|
+
|Error details
|
|
508
|
+
|Basic
|
|
509
|
+
|Basic
|
|
510
|
+
|Basic
|
|
511
|
+
|Comprehensive
|
|
512
|
+
|===
|
|
513
|
+
|
|
514
|
+
=== Analysis Features
|
|
515
|
+
|
|
516
|
+
[cols="3,1,1,1,1",options="header"]
|
|
517
|
+
|===
|
|
518
|
+
|Feature |pngcheck |ImageMagick |pngcrush |PngConform
|
|
519
|
+
|
|
520
|
+
|Resolution/DPI
|
|
521
|
+
|Basic
|
|
522
|
+
|✓
|
|
523
|
+
|No
|
|
524
|
+
|✓ Enhanced
|
|
525
|
+
|
|
526
|
+
|Retina analysis
|
|
527
|
+
|No
|
|
528
|
+
|No
|
|
529
|
+
|No
|
|
530
|
+
|✓ (@1x/@2x/@3x)
|
|
531
|
+
|
|
532
|
+
|Optimization hints
|
|
533
|
+
|No
|
|
534
|
+
|No
|
|
535
|
+
|No
|
|
536
|
+
|✓
|
|
537
|
+
|
|
538
|
+
|Compression ratio
|
|
539
|
+
|✓
|
|
540
|
+
|✓
|
|
541
|
+
|✓
|
|
542
|
+
|✓
|
|
543
|
+
|
|
544
|
+
|Metadata extraction
|
|
545
|
+
|Basic
|
|
546
|
+
|✓
|
|
547
|
+
|No
|
|
548
|
+
|✓
|
|
549
|
+
|
|
550
|
+
|Color profile info
|
|
551
|
+
|Basic
|
|
552
|
+
|✓
|
|
553
|
+
|No
|
|
554
|
+
|✓
|
|
555
|
+
|
|
556
|
+
|Chunk statistics
|
|
557
|
+
|Basic
|
|
558
|
+
|No
|
|
559
|
+
|✓
|
|
560
|
+
|✓ Comprehensive
|
|
561
|
+
|===
|
|
562
|
+
|
|
563
|
+
== Conclusion
|
|
564
|
+
|
|
565
|
+
=== Choose PngConform when you need:
|
|
566
|
+
|
|
567
|
+
* Ruby integration
|
|
568
|
+
* Structured output (YAML/JSON)
|
|
569
|
+
* Detailed validation reports
|
|
570
|
+
* Retina/mobile analysis
|
|
571
|
+
* Optimization recommendations
|
|
572
|
+
* CI/CD metrics
|
|
573
|
+
* Modern output formatting
|
|
574
|
+
|
|
575
|
+
=== Choose pngcheck when you need:
|
|
576
|
+
|
|
577
|
+
* Fastest possible validation
|
|
578
|
+
* Minimal dependencies
|
|
579
|
+
* Reference implementation
|
|
580
|
+
* Shell script integration
|
|
581
|
+
|
|
582
|
+
=== Choose ImageMagick when you need:
|
|
583
|
+
|
|
584
|
+
* Multi-format support
|
|
585
|
+
* Image conversion
|
|
586
|
+
* Basic information
|
|
587
|
+
* System-level tools
|
|
588
|
+
|
|
589
|
+
=== Choose pngcrush when you need:
|
|
590
|
+
|
|
591
|
+
* Actual file optimization
|
|
592
|
+
* Compression improvement
|
|
593
|
+
* File size reduction
|
|
594
|
+
|
|
595
|
+
=== Use PngConform with other tools:
|
|
596
|
+
|
|
597
|
+
[example]
|
|
598
|
+
====
|
|
599
|
+
[source,bash]
|
|
600
|
+
----
|
|
601
|
+
# Validate first
|
|
602
|
+
png_conform check image.png
|
|
603
|
+
|
|
604
|
+
# Then optimize
|
|
605
|
+
pngcrush -brute image.png optimized.png
|
|
606
|
+
|
|
607
|
+
# Verify optimization
|
|
608
|
+
png_conform check --optimize optimized.png
|
|
609
|
+
----
|
|
610
|
+
====
|
|
611
|
+
|
|
612
|
+
== See Also
|
|
613
|
+
|
|
614
|
+
* link:../README.adoc[PngConform Documentation]
|
|
615
|
+
* link:CHUNK_TYPES.adoc[Chunk Types Reference]
|
|
616
|
+
* link:CLI_OPTIONS.adoc[CLI Options]
|