All pastes #142202 Raw Edit

nusch

public cpp v1 · immutable
#142202 ·published 2006-08-21 10:21 UTC
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&#347;ci bajtów potrzebnych do wyrównania  // ka&#380;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&#322;adzie BGR          if (fscanf (bmp,"%c%c%c",img + 2,img + 1,img) < 3)            return;          img += 3;        }      // przeskok bajtów wyrównuj&#261;cych      // wiersz do granicy 4 bajtów      if (skip)        fseek (bmp,skip,SEEK_CUR);    }}// odczyt pliku BMP// name - nazwa pliku// image - wska&#378;nik na dane obrazu// cmap - wska&#378;nik na dane o mapie kolorów// width - szeroko&#347;&#263; obrazu// height - wysoko&#347;&#263; obrazu// type - rodzaj obrazuvoid load_bmp (const string name, unsigned char *&image,               unsigned char *&cmap,               int &width, int &height,               BitmapType &type){  // pocz&#261;tkowe warto&#347;ci danych wyj&#347;ciowych  image = NULL;  width = 0;  height = 0;  type = NO_BITMAP;  // otwarcie pliku do odczytu  FILE *bmp = fopen (name.c_str (),"rb");  // sprawdzenie poprawno&#347;ci otwarcia pliku  if (!bmp)    throw BITMAP_ERROR_OPEN_FILE;  // bufor  char filebuf [BITMAP_BUFOR_SIZE];  setbuf (bmp,filebuf);  // tablica na struktur&#281; 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&#347;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&#347;&#263; bitów na piksel  int bcBitCount;  // domy&#347;lne warto&#347;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&#281;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&#281;cie pola biClrImportant        fseek (bmp,4,SEEK_CUR);        break;      // nowy format OS/2      case BMP_NEWOS2_SIZE:      // najprawdopodobniej nowy format OS/2      // z niepe&#322;n&#261; struktur&#261; BITMAPINFOHEADER2      default:        // sprawdzenie czy s&#261; wszystkie pola        // niezb&#281;dne do prawid&#322;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&#322;ugo&#347;ci nag&#322;owka        if (bcSize >= 36)          {            // pomini&#281;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&#281;cie pozosta&#322;ych pól nag&#322;ó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&#281;cie pliku  fclose (bmp);}