Форматы графических файлов
Необходимо описание и по возможности программная реализация открытие-сохранение графических файлов, причём не самых известных (НЕ .gif, .jpg, .tiff, .bmp). Если кто-нибудь с таким сталкивался - HELP!!!!!!!! (: заранее благодарю
Очень хороший формат TGA ? (хороший для RGBA -
в нём ничего лишнего)
структура:
typedef struct {
unsigned int width, height, bpp;
unsigned char *pData;
} DATA_TGA;
DATA_TGA dtga;
bool LoadTGA(char *path)
{
unsigned char *pBuffer;
char szStr[1024];
memset(dtga, 0, sizeof(DATA_TGA));
unsigned char TGAHeader[12] = {0,0,2,0,0,0,0,0,0,0,0,0};
unsigned char TGAHead[6];
unsigned char *pPtr;
unsigned int bytesPerPixel;
ifstream ifs;
ifs.open(path, ios::in|ios::binary|ios::beg|ios::nocreate);
if(ifs.fail())
{
memset(szStr, 0, sizeof(char)*1024);
strcpy(szStr, "Can Not Load File: ");
strcat(szStr, path);
MessageBox(0, szStr, "Load Error",MB_OK|MB_ICONEXCLAMATION);
return false;
}
ifs.seekg(0, ios::end);
unsigned long fileSize = ifs.tellg();
ifs.seekg(0, ios::beg);
pBuffer = new unsigned char[fileSize];
ifs.read(pBuffer, fileSize);
ifs.close();
pPtr = pBuffer;
if(memcmp(pPtr, TGAHeader, sizeof(TGAHeader))!=0)
{
MessageBox(0, "Bitmap Loading Failed","LOAD ERROR",MB_OK|MB_ICONEXCLAMATION);
return false;
}
else
{
pPtr+=sizeof(TGAHeader);
memcpy(TGAHead, pPtr, sizeof(TGAHead));
dtga.width = TGAHead[1] * 256 + TGAHead[0];
dtga.height = TGAHead[3] * 256 + TGAHead[2];
if((dtga.width <= 0) || (dtga.height <= 0))
{
MessageBox(0, "Bitmap Loading Failed","LOAD ERROR", MB_OK|MB_ICONEXCLAMATION);
return false;
}
dtga.bpp = TGAHead[4];
if((dtga.bpp != 24) && (dtga.bpp != 32))
{
MessageBox(0, "Bitmap Loading Failed","LOAD ERROR", MB_OK|MB_ICONEXCLAMATION);
return false;
}
bytesPerPixel = (dtga.bpp)/8;
//BitmapSize - размер растра
unsigned long BitmapSize = (dtga.height)*(dtga.width)*bytesPerPixels;
dtga.pData = (unsigned char *)malloc(BitmapSize);
pPtr+=sizeof(TGAHead);
memcpy(dtga.pData, pPtr, BitmapSize);
}
delete [] pBuffer;
return true;
}
Вроде так... - это загрузка,
думаю с сохранением проблем не будет...- но если надо и его написать могу.
Цитата:
Originally posted by Lilo
Необходимо описание и по возможности программная реализация открытие-сохранение графических файлов, причём не самых известных (НЕ .gif, .jpg, .tiff, .bmp). Если кто-нибудь с таким сталкивался - HELP!!!!!!!! (: заранее благодарю
Необходимо описание и по возможности программная реализация открытие-сохранение графических файлов, причём не самых известных (НЕ .gif, .jpg, .tiff, .bmp). Если кто-нибудь с таким сталкивался - HELP!!!!!!!! (: заранее благодарю
На любой вкус и цвет:
http://www.wotsit.org , в разделе графические файлы
Цитата:
Originally posted by bave
думаю с сохранением проблем не будет...- но если надо и его написать могу.
думаю с сохранением проблем не будет...- но если надо и его написать могу.
если не сложно то - нада) огромное спасибо за помощь (:
#include <fstream.h> //Это надо не забыть подключить
//В функцию передаём указатель на объект структуры
//в которою загрузили картинку
bool SaveTGA(
char *path, //Путь - куда сохранять
DATA_TGA *ptga //Указатель на картинку
)
{
unsigned char TGAHeader[12] = {0,0,2,0,0,0,0,0,0,0,0,0};
unsigned char TGAHead[6];
unsigned char *pBuff;
unsigned char *pPtr;
unsigned int bytesPerPixel = (ptga->bpp)/8;
unsigned long fSize = (ptga->width)*(ptga->height)*bytesPerPixel;
pBuff = (unsigned char *)malloc(fSize+18 );
pPtr = pBuff;
memset(pPtr, 0, (fSize+18 ));
//Обратно формируем заголовок
//Хотя лучше было сохранить, его при загрузке
//(чё то я про это не подумал :) )
memcpy(pPtr, TGAHeader, sizeof(TGAHeader));
pPtr+=sizeof(TGAHeader);
memset(TGAHead, 0, sizeof(TGAHead));
TGAHead[0] = ((ptga->width) - (ptga->width)%256);
TGAHead[1] = (ptga->width)%256;
TGAHead[2] = (ptga->height) - (ptga->height)%256;
TGAHead[3] = (ptga->height)%256;
TGAHead[4] = ptga->bpp;
memcpy(pPtr, TGAHead, sizeof(TGAHead));
pPtr+=sizeof(TGAHead);
memcpy(pPtr, ptga->pData, fSize);
ofstream outFile(path, ios::trunc|ios::binary);
if(!outFile)
{
MessageBox(NULL, "Can Not Write File","Error", MB_OK|MB_ICONERROR);
return false;
}
outFile.write(pBuff, (fSize+18 ));
outFile.close();
delete [] pBuff;
return true;
}
Ну вот вроде так, если нигде не накосячил...
Цитата:
Originally posted by bave
ну вот так:
...........
Ну вот вроде так, если нигде не накосячил...
ну вот так:
...........
Ну вот вроде так, если нигде не накосячил...
вай) пойду дальше изучать)) благобдарю (: хотела сказать, что если что помогу, но понимаю на сколько глупо енто звучит. так что просто спасибо (: