]> git.sur5r.net Git - iecprint/blob - image2mps.cpp
Import as-is
[iecprint] / image2mps.cpp
1 #include <iostream>
2 #include <string>
3 #include <vector>
4
5 #include <Magick++.h>
6
7 const unsigned int MAX_WIDTH=480;
8
9 int usage(const char* name)
10 {
11     std::cerr << "Usage: " << name << " IMAGE" << std::endl << "MPS801 datastream gets written to stdout" << std::endl;
12     return 1;
13 }
14
15 int main(int argc, char **argv)
16 {
17     if(argc != 2)
18         return usage(argv[0]);
19
20     auto img = Magick::Image(argv[1]);
21
22     if(img.columns() > MAX_WIDTH)
23     {
24         std::cerr << "Cropping width to " << MAX_WIDTH << "px" << std::endl;
25         img.crop(Magick::Geometry(MAX_WIDTH, img.rows(), 0, 0));
26     }
27
28     if(img.totalColors() > 2)
29     {
30         std::cerr << "Converting to bi-level image." << std::endl;
31         img.type(Magick::BilevelType);
32     }
33
34     std::vector<std::vector<uint8_t>> mps;
35     mps.insert(mps.begin(), { 0x08 });
36
37     img.modifyImage();
38     auto columns = img.columns();
39     auto rows = img.columns();
40
41     auto pixels = img.getPixels(0, 0, columns, rows);
42
43     for(size_t row=0; row < rows; row+=7)
44     {
45         std::vector<uint8_t> line(columns, 0x80);
46         for(auto subrow=0; subrow < 7; subrow++)
47         {
48             if(row+subrow >= rows)
49                 break;
50             for(size_t column=0; column < columns; column++)
51             {
52                 auto pixel = pixels + (row+subrow)*columns + column;
53                 if((pixel->red)==0)
54                     line[column] |= 1<<subrow;
55             }
56         }
57         mps.push_back(line);
58         mps.push_back({0x15, 0x0D, 0x08});
59     }
60
61     for(auto line : mps)
62         for(auto byte: line)
63             std::cout << byte;
64 }