Отправляет email-рассылки с помощью сервиса Sendsay

Одинокий программист

  Все выпуски  

Одинокий программист


Информационный Канал Subscribe.Ru


Одинокий программист
Рассылки Subscribe.Ru
Одинокий программист

PCX файлы. #2

www.sandsc.narod.ru
e-mail:bigking@mail.ru, Седельников Александр

  Здравствуйте, это снова я! Сегодня речь пойдет о PCX файлах. Здесь все просто! Распаковка пустяковая RLE! Мне в TGA’ках больше нравится. А вообще в одном из следующих выпусков надо сделать самим свой формат! Потому что, например в TGA изображение перевернуто(fliping). Лучше сделать свой, со своими наворотами. А PCX файл распаковать можнно следующим образом: Пусть sizePicture=Width*Height

0. пока sizePicture>0 {
1. cnt=1
2. читаем один байт
3. если (байт AND 0xC0) то
4. { cnt=байт AND 0x3F
5.  читаем следующий байт }
6. sizePicture= sizePicture-cnt;
7. цикл cx=0 to cnt
8. { буфер[cx]=байт } }

Свой пример я написал с маху, и не знаю работает он или нет! Но он должен из 8-битного PCX’a сделать 24-битную картинку, поместив ее в buffer.

///////////////////////////////////////////////////////////////////////////////////////////
// PCX.H reader by S&S Company
///////////////////////////////////////////////////////////////////////////////////////////
#ifndef __PCX_H__
#define __PCX_H__

struct PCXHeader
{
  char ID;
  char Version;
  char Encoding;
  char BitsPerPixel;
  unsigned short  XStart;
  unsigned short  YStart;
  unsigned short  XEnd;
  unsigned short  YEnd;
  unsigned short  HorzRes;
  unsigned short  VertRes;
  char Palette[48];
  char Reserved1;
  char NumBitPlanes;
  unsigned short  charsPerLine;
  unsigned short  PaletteType;
  unsigned short  HorzScreenSize;
  unsigned short  VertScreenSize;
  char Reserved2[54];
} _ph;

int ReadPCXFile(char *fileName,char *buffer)
{
 int cx;
 FILE *fp=fopen(fileName,"rb");
 if(fp==NULL) return 1;       ///////
 fread(&_ph,sizeof(PCXHeader),1,fp);
 if(_ph.ID!=0x0A) return 2;   ///////
 if(_ph.BitsPerPixel!=8) return 3;
 buffer=NULL;
 int w = _ph.XEnd - _ph.XStart + 1;
 int h = _ph.YEnd - _ph.YStart + 1;
 buffer=new char[w*h*3];
 if(!buffer) return 3;        ///////
 char *ptr=buffer;
 char byte=0;
 char pal[768];
 fseek(fp,0,2);
 fread(pal,768,1,fp);
 fseek(fp,sizeof(PCXHeader),0);
 int cnt=0;
 int sz=w*h;
do
{
 cnt=1;
 fread(&byte,1,1,fp);
 if((byte&0xC0)==0xC0)
 {
  cnt=byte&0x3F;
  fread(&byte,1,1,fp);
 }
 sz=sz-cnt;
 for(cx=0;cx0);
 fclose(fp);
 return 0;
}


#endif

Вот и все!


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное