Greetings,
I am trying to resize a bitmap in memory using
StretchDIBits and GetDIBits and, in turn, output
the file to a BIP format.
Without resizing the following code works fine
when outputting a BIP.
Code:
out_byte = (BYTE *) calloc(NCOLS*JP2_CHANNELS,1);
if (out_byte == NULL) return false;
out_data = (BYTE *) calloc(NCOLS*NROWS*JP2_CHANNELS,1);
if (out_data == NULL)
{
free(out_byte);
return false;
}
// Open output bip and hdr files.
success = true;
success = success && (! ((out_bip = fopen(bip_path,"wb")) == NULL));
success = success && (! ((out_hdr = fopen(hdr_path,"w")) == NULL));
// Get source image
// Contains Data and BITMAPINFO header.
GetImage(Path,this->m_timage);
BYTE *pData = (BYTE *)this->m_timage.Data;
// Have to flip bmp and change windows BGR to RGB.
for(int y = NROWS - 1; y >= 0; y--)
{
pData2 += (y * NCOLS * JP2_CHANNELS);
for(int x = 0; x < NCOLS*JP2_CHANNELS; x+=JP2_CHANNELS)
{
out_byte[x] = pData2[2]; //R
out_byte[x+1] = pData2[1]; //G
out_byte[x+2] = pData2[0]; //B
pData2 += 3;
}
// Write out entire line.
fwrite(out_byte,1,NCOLS*JP2_CHANNELS,out_bip);
// Reset pData to bottom of image.
//pData = (BYTE *)this->m_timage.Data;
pData2 = out_data;
}
free (out_byte);
free (out_data);
The above code is not compilable but should
give a rough idea of what I am doing.
When I attempt to add resizing in the picture
I get an empty black image:
Code:
out_byte = (BYTE *) calloc(NCOLS*JP2_CHANNELS,1);
if (out_byte == NULL) return false;
out_data = (BYTE *) calloc(NCOLS*NROWS*JP2_CHANNELS,1);
if (out_data == NULL)
{
free(out_byte);
return false;
}
// Open output bip and hdr files.
success = true;
success = success && (! ((out_bip = fopen(bip_path,"wb")) == NULL));
success = success && (! ((out_hdr = fopen(hdr_path,"w")) == NULL));
// Get source image
// Contains Data and BITMAPINFO header.
GetImage(Path,this->m_timage);
HDC MemDC = CreateCompatibleDC(NULL);
//HBITMAP BmpHnd = CreateBitmap(NCOLS,NROWS,1,24,NULL);
HBITMAP BmpHnd = CreateCompatibleBitmap(MemDC, NCOLS, NROWS);
HBITMAP OldBmp = (HBITMAP) SelectObject(MemDC,BmpHnd);
StretchDIBits(MemDC,0,0,NCOLS,NROWS,0,0,this->Cols,this->Rows,this->m_timage.Data,&(this->m_timage.Info),DIB_RGB_COLORS,SRCCOPY);
int numScanned = GetDIBits(MemDC,BmpHnd,0,NROWS-1,out_data,&Info,DIB_RGB_COLORS);
char t[256];
sprintf(t, "num scanned: %d\n", numScanned);
OutputDebugString(t);
//int err = GetLastError();
//char t[256];
//sprintf(t, "error message: %d\n", err);
//OutputDebugString(t);
SelectObject(MemDC,OldBmp);
DeleteObject(BmpHnd);
BYTE *pData = out_data;
// Have to flip bmp and change windows BGR to RGB.
for(int y = NROWS - 1; y >= 0; y--)
{
pData2 += (y * NCOLS * JP2_CHANNELS);
for(int x = 0; x < NCOLS*JP2_CHANNELS; x+=JP2_CHANNELS)
{
out_byte[x] = pData2[2]; //R
out_byte[x+1] = pData2[1]; //G
out_byte[x+2] = pData2[0]; //B
pData2 += 3;
}
// Write out entire line.
fwrite(out_byte,1,NCOLS*JP2_CHANNELS,out_bip);
// Reset pData to bottom of image.
//pData = (BYTE *)this->m_timage.Data;
pData2 = out_data;
}
free (out_byte);
free (out_data);
Is my use of StretchDIBits and GetDIbits correct?
Am I missing something else?
Any help would be greatly appreciated.
Cheers.