7 const unsigned int MAX_WIDTH=480;
9 int usage(const char* name)
11 std::cerr << "Usage: " << name << " IMAGE" << std::endl << "MPS801 datastream gets written to stdout" << std::endl;
15 int main(int argc, char **argv)
18 return usage(argv[0]);
20 auto img = Magick::Image(argv[1]);
22 if(img.columns() > MAX_WIDTH)
24 std::cerr << "Cropping width to " << MAX_WIDTH << "px" << std::endl;
25 img.crop(Magick::Geometry(MAX_WIDTH, img.rows(), 0, 0));
28 if(img.totalColors() > 2)
30 std::cerr << "Converting to bi-level image." << std::endl;
31 img.type(Magick::BilevelType);
34 std::vector<std::vector<uint8_t>> mps;
35 mps.insert(mps.begin(), { 0x08 });
38 auto columns = img.columns();
39 auto rows = img.columns();
41 auto pixels = img.getPixels(0, 0, columns, rows);
43 for(size_t row=0; row < rows; row+=7)
45 std::vector<uint8_t> line(columns, 0x80);
46 for(auto subrow=0; subrow < 7; subrow++)
48 if(row+subrow >= rows)
50 for(size_t column=0; column < columns; column++)
52 auto pixel = pixels + (row+subrow)*columns + column;
54 line[column] |= 1<<subrow;
58 mps.push_back({0x15, 0x0D, 0x08});