diff options
Diffstat (limited to 'example_png2bmp.cpp')
-rw-r--r-- | example_png2bmp.cpp | 132 |
1 files changed, 0 insertions, 132 deletions
diff --git a/example_png2bmp.cpp b/example_png2bmp.cpp deleted file mode 100644 index 3fd8328..0000000 --- a/example_png2bmp.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* -LodePNG Examples - -Copyright (c) 2005-2012 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#include "lodepng.h" -#include <iostream> - -/* -This example converts a PNG file to a BMP file. -NOTE: it overwrites the output file without warning if it exists! -Give the PNG and the BMP file names as command line arguments. -*/ - -/* -g++ lodepng.cpp example_png2bmp.cpp -Wall -Wextra -pedantic -ansi -lSDL -O3 -*/ - - - -//Input image must be RGB buffer (3 bytes per pixel), but you can easily make it -//support RGBA input and output by changing the inputChannels and/or outputChannels -//in the function to 4. -void encodeBMP(std::vector<unsigned char>& bmp, const unsigned char* image, int w, int h) -{ - //3 bytes per pixel used for both input and output. - int inputChannels = 3; - int outputChannels = 3; - - //bytes 0-13 - bmp.push_back('B'); bmp.push_back('M'); //0: bfType - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //2: bfSize; size not yet known for now, filled in later. - bmp.push_back(0); bmp.push_back(0); //6: bfReserved1 - bmp.push_back(0); bmp.push_back(0); //8: bfReserved2 - bmp.push_back(54 % 256); bmp.push_back(54 / 256); bmp.push_back(0); bmp.push_back(0); //10: bfOffBits (54 header bytes) - - //bytes 14-53 - bmp.push_back(40); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //14: biSize - bmp.push_back(w % 256); bmp.push_back(w / 256); bmp.push_back(0); bmp.push_back(0); //18: biWidth - bmp.push_back(h % 256); bmp.push_back(h / 256); bmp.push_back(0); bmp.push_back(0); //22: biHeight - bmp.push_back(1); bmp.push_back(0); //26: biPlanes - bmp.push_back(outputChannels * 8); bmp.push_back(0); //28: biBitCount - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //30: biCompression - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //34: biSizeImage - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //38: biXPelsPerMeter - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //42: biYPelsPerMeter - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //46: biClrUsed - bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //50: biClrImportant - - /* - Convert the input RGBRGBRGB pixel buffer to the BMP pixel buffer format. There are 3 differences with the input buffer: - -BMP stores the rows inversed, from bottom to top - -BMP stores the color channels in BGR instead of RGB order - -BMP requires each row to have a multiple of 4 bytes, so sometimes padding bytes are added between rows - */ - - int imagerowbytes = outputChannels * w; - imagerowbytes = imagerowbytes % 4 == 0 ? imagerowbytes : imagerowbytes + (4 - imagerowbytes % 4); //must be multiple of 4 - - for(int y = h - 1; y >= 0; y--) //the rows are stored inversed in bmp - { - int c = 0; - for(int x = 0; x < imagerowbytes; x++) - { - if(x < w * outputChannels) - { - int inc = c; - //Convert RGB(A) into BGR(A) - if(c == 0) inc = 2; - else if(c == 2) inc = 0; - bmp.push_back(image[inputChannels * (w * y + x / outputChannels) + inc]); - } - else bmp.push_back(0); - c++; - if(c >= outputChannels) c = 0; - } - } - - // Fill in the size - bmp[2] = bmp.size() % 256; - bmp[3] = (bmp.size() / 256) % 256; - bmp[4] = (bmp.size() / 65536) % 256; - bmp[5] = bmp.size() / 16777216; -} - -int main(int argc, char *argv[]) -{ - if(argc < 3) - { - std::cout << "Please provice input PNG and output BMP file names" << std::endl; - return 0; - } - const char* infile = argv[1]; - const char* outfile = argv[2]; - - - std::vector<unsigned char> image; //the raw pixels - unsigned width, height; - - unsigned error = lodepng::decode(image, width, height, infile, LCT_RGB, 8); - - if(error) - { - std::cout << "error " << error << ": " << lodepng_error_text(error) << std::endl; - return 0; - } - - std::vector<unsigned char> bmp; - encodeBMP(bmp, &image[0], width, height); - - lodepng::save_file(bmp, outfile); -} |