rendered paste body#include <stdio.h>#include "libbmp.h"#include <iostream>void loadBMP24 (FILE *bmp, unsigned char *&image,int width, int height);using namespace std;int main(){ unsigned char *image = NULL; unsigned char *cmap = NULL; bool wynik[60000]; int licznik=0; char znak; int kolor; // do przeskakiwania tylko na R, tylko na G albo B int width,height; BitmapType type = NO_BITMAP; load_bmp("stego.bmp",image,cmap,width,height,type); do { //najpierw dla Blue znak = *image; wynik[licznik]=znak%2; image+=3; } while (znak!=NULL); system("PAUSE");} void loadBMP24 (FILE *bmp, unsigned char *&image, int width, int height){ // obliczenie ilości bajtów potrzebnych do wyrównania // każdego wiersza obrazu do 4 granicy bajtów int skip = ((width * 24 + 31) / 32) * 4 - width * 3; // odczyt poszczególnych wierszy obrazu for (int h = height - 1; h >= 0; h--) { unsigned char *img = image + h * width * 3; for (int w = 0; w < width; w++) { // odczyt pikseli w układzie BGR if (fscanf (bmp,"%c%c%c",img + 2,img + 1,img) < 3) return; img += 3; } // przeskok bajtów wyrównujących // wiersz do granicy 4 bajtów if (skip) fseek (bmp,skip,SEEK_CUR); }}// odczyt pliku BMP// name - nazwa pliku// image - wskaźnik na dane obrazu// cmap - wskaźnik na dane o mapie kolorów// width - szerokość obrazu// height - wysokość obrazu// type - rodzaj obrazuvoid load_bmp (const string name, unsigned char *&image, unsigned char *&cmap, int &width, int &height, BitmapType &type){ // początkowe wartości danych wyjściowych image = NULL; width = 0; height = 0; type = NO_BITMAP; // otwarcie pliku do odczytu FILE *bmp = fopen (name.c_str (),"rb"); // sprawdzenie poprawności otwarcia pliku if (!bmp) throw BITMAP_ERROR_OPEN_FILE; // bufor char filebuf [BITMAP_BUFOR_SIZE]; setbuf (bmp,filebuf); // tablica na strukturę BITMAPFILEHEADER pliku bmp unsigned char header [BMP_BITMAPFILEHEADER_SIZE]; // odczyt struktury BITMAPFILEHEADER if (fread (header,BMP_BITMAPFILEHEADER_SIZE,1,bmp) < 1) throw BITMAP_ERROR_FILE; // sprawdzenie wartości pola bfType/usType if (header [0] != BMP_TYPE_B || header [1] != BMP_TYPE_M) throw BITMAP_ERROR_FILE; // bufor do selektywnego odczytu poszczególnych // pól struktur pliku BMP unsigned char buf [4]; // pole bcBitCount/cBitCount - ilość bitów na piksel int bcBitCount; // domyślne wartości pól biCompression i biClrUsed int biCompression = 0; int biClrUsed = 0; // odczyt pola bcSize/cbFix struktur: BITMAPCOREHEADER, // BITMAPINFOHEADER i BITMAPINFOHEADER2 if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; int bcSize = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // rozpoznanie wersji pliku BMP switch (bcSize) { // stary format pliku BMP case BMP_OLD_SIZE: // odczyt pól bcWidth/cx i bcHeight/cy if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; width = buf [0] + (buf [1] << 8); height = buf [2] + (buf [3] << 8); // odczyt pól bcPlanes/cPlanes i bcBitCount/cBitCount if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; bcBitCount = buf [2] + (buf [3] << 8); // sprawdzenie pola bcBitCount/cBitCount if (bcBitCount != 1 && bcBitCount != 4 && bcBitCount != 8 && bcBitCount != 24) throw BITMAP_ERROR_FILE; break; // nowy format Windows case BMP_NEWWIN_SIZE: // odczyt pola bcWidth if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; width = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // odczyt pola bcHeight if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; height = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // odczyt pól bcPlanes i bcBitCount if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; bcBitCount = buf [2] + (buf [3] << 8); // sprawdzenie pola bcBitCount if (bcBitCount != 1 && bcBitCount != 4 && bcBitCount != 8 && bcBitCount != 16 && bcBitCount != 24 && bcBitCount != 32) throw BITMAP_ERROR_FILE; // odczyt pola biCompression if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; biCompression = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // sprawdzenie pola biCompression if (biCompression != BMP_NO_COMPRESSION && biCompression != BMP_RLE8_COMP && biCompression != BMP_RLE4_COMP) throw BITMAP_ERROR_FILE; // pominięcie pól biSizeImage, biXPelsPerMeter i biYPelsPerMeter fseek (bmp,12,SEEK_CUR); // odczyt pola biClrUsed if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; biClrUsed = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // pominięcie pola biClrImportant fseek (bmp,4,SEEK_CUR); break; // nowy format OS/2 case BMP_NEWOS2_SIZE: // najprawdopodobniej nowy format OS/2 // z niepełną strukturą BITMAPINFOHEADER2 default: // sprawdzenie czy są wszystkie pola // niezbędne do prawidłowego odczytu pliku // (cbFix, cx, cy, cPlanes, cBitCount i ulCompression) if (bcSize < 20) throw BITMAP_ERROR_FILE; // odczyt pola cx if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; width = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // odczyt pola cy if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; height = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // odczyt pól cPlanes i cBitCount if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; bcBitCount = buf [2] + (buf [3] << 8); // sprawdzenie pola bcBitCount; plik w nowej wersji OS/2 // nie przewiduje obrazów w formacie 16bpp i 32bpp if (bcBitCount != 1 && bcBitCount != 4 && bcBitCount != 8 && bcBitCount != 24) throw BITMAP_ERROR_FILE; // odczyt pola ulCompression if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; biCompression = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); // sprawdzenie pola ulCompression if (biCompression != BMP_NO_COMPRESSION && biCompression != BMP_RLE8_COMP && biCompression != BMP_RLE4_COMP) throw BITMAP_ERROR_FILE; // ponowne sprawdzenie długości nagłowka if (bcSize >= 36) { // pominięcie pól cbImage, cxResolution i cyResolution fseek (bmp,12,SEEK_CUR); // odczyt pola cclrUsed if (fread (buf,4,1,bmp) < 1) throw BITMAP_ERROR_FILE; biClrUsed = buf [0] + (buf [1] << 8) + (buf [2] << 16) + (buf [3] << 24); } // pominięcie pozostałych pól nagłówka fseek (bmp,BMP_BITMAPFILEHEADER_SIZE + bcSize,SEEK_SET); break; } // bufor na dane obrazu switch (bcBitCount) { case 1: case 4: case 8: image = new unsigned char [width * height]; break; case 16: case 24: image = new unsigned char [width * height * 3]; break; case 32: image = new unsigned char [width * height * 4]; break; } // wczytanie obrazu switch (bcBitCount) { case 24: type = BITMAP_24_BPP; loadBMP24 (bmp,image,width,height); break; } // zamknięcie pliku fclose (bmp);}