|
이미지 처리에 대한 공부를 하고 있어서요 ^^;
PGM, PPM 확장자를 가진 이미지를 공부하고 있습니다.
이 이미지를 열려고 뷰어를 만들고 있습니다.
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
OpenDialog1->Execute();
String fileName;
fileName = OpenDialog1->FileName;
char* po;
po = fileName.c_str();
try
{
KPGM pgm;
pgm.Load(po);
//for image draw
Graphics::TBitmap*gbitmap = new Graphics::TBitmap();
TMemoryStream* pms = new TMemoryStream();
pms->Read(&pgm._ppA[0],pgm.Size());
gbitmap->LoadFromStream(pms);
gbitmap->Height = pgm.Row();
gbitmap->Width = pgm.Col();
gbitmap->ScanLine[0];
PaintBox1->Canvas->Draw(0,0,gbitmap);
delete gbitmap;
}
catch(...)
{
ShowMessage("Woops");
}
}
//---------------------------------------------------------------------------
bool KPGM::Load(char* szFile) //tag: gm
{
FILE *fp;
int dummy;
char buf[10];
//create a file pointer
if((fp=fopen(szFile,"rb")) == 0)
return false;
//read its ID
fscanf(fp,"%s",buf);
if((buf[0]!='P')|| buf[1]!='5') {
fclose(fp);
return false;
}
fgetc(fp);
//skip comment lines if exists
while((dummy=fgetc(fp)) == '#')
while(fgetc(fp) != '\n');
ungetc(dummy,fp);
//read dimensions
int nCol,nRow;
fscanf(fp,"%d%d%d",&nCol,&nRow,&dummy);
fgetc(fp);
// memory alloc.
KImageGray::Create(nRow,nCol);
//read data
for(int i=0; i<nRow; i++)
fread(_ppA[i],1,nCol,fp);
fclose(fp);
return true;
}
대략 이런 이런 코드를 작성했죠
그런데 구동이 되질 않는군요 ㅡ.,ㅡ;
그냥 하얀색이미지만 뿌려지는것을 보니 데이터를 넘겨받지 못하는거 같습니다.
데이터가 들어가있는 메모리를 _ppA가 알고 있구요
_ppA(unsigned cahe**))의 첫번째 주소만 넘겨주면 scanline[0] 이 첫번째 열을 읽어들여서 화면에 뿌려야 하는데
제 아이디어가 잘못된건가요?
_ppA의 타입이 TBitmap에서는 읽기가 좀 그래서 스트림으로 받아들여 넘겨주려고 합니다. ^^;
접근방법이 잘못된것일지도 모르구요
도와주세요~~
: 굳이 이미지 파일 포맷에 대해 구체적으로 공부하고 싶다면 모를까 이미지 파일에 대해 fopen,fread 등을 사용하여 Raw Data를 다룰 일은 없습니다.
:
: 특별히 그렇게 만들지 않는 이상 이미지 파일은 단순한 픽셀 정보만 플랫하게 들어가 있는 것이 아닙니다.
: 다시말해 님이 말씀하신 것과 같은 이미지 파일은 표준이 아닙니다.
: 이미지 파일에는 선두에 헤더가 있습니다.
: 헤더 형식은 이미지 파일의 형식에 따라 다를 수 있구요.
: 한편 이미지 파일의 픽셀 정보는 픽셀 정보를 그대로 저장하지 않는다고 보면 됩니다.
: 일예로, JPEG 형식은 압축하여 저장합니다.
: 결국, 이미지 파일에 대해 조작을 가하려면 해당 이미지 형식에 맞는 컴포넌트를 사용하시는 게 좋습니다.
: Bitmap 형식은 Graphics::TBitmap, JPEG 형식은 TJPEGImage ...
|