HBITMAP hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&m_pBitmapInfoHeader, DIB_RGB_COLORS,(VOID **) (&pByte), NULL, 0) ;m_pBitmapInfoHeader是自己赋值的
pByte 是空指针
在读取jpeg文件,将里面数据变成rgb数据时用到,总是用不好,
能否解释一下
pByte 是空指针
在读取jpeg文件,将里面数据变成rgb数据时用到,总是用不好,
能否解释一下
GetImageFromJPG(CString csFileName)
{
JPEG_CORE_PROPERTIES image;
CString strTemp="";
//メモリの空間を配布する。
ZeroMemory( &image, sizeof( JPEG_CORE_PROPERTIES ) );
BYTE* iImageData =NULL;
char comments[1024];
int imageChannels;
SIZE imageDims;
BeginWaitCursor();
ZeroMemory( &comments, sizeof( comments[1024] ) );
comments[0] = 0;
try
{
//メモリにある画像のデータを初期化する。
if( ijlInit( &image ) != IJL_OK )
{
return _UNEXPECTED_ERROR;
}
image.JPGFile = csFileName;
image.jprops.jpeg_comment = &comments[0];
image.jprops.jpeg_comment_size = sizeof(comments);
//画像ファイルのインフォメーションを読み込む。
if( ijlRead( &image, IJL_JFILE_READPARAMS ) != IJL_OK )
{
return _UNEXPECTED_ERROR;
}
if(comments[0] != 0)
{
int tail = min(sizeof(comments),image.jprops.jpeg_comment_size);
comments[tail] = 0;
strTemp.Format("%s",&comments[0]);
}
m_JPGFileInfo.m_Title=strTemp;
switch(image.JPGChannels)
{
case 1:
image.JPGColor = IJL_G;
image.DIBChannels = 3;
image.DIBColor = IJL_BGR;
break;
case 3:
image.JPGColor = IJL_YCBCR;
image.DIBChannels = 3;
image.DIBColor = IJL_BGR;
break;
case 4:
image.JPGColor = IJL_YCBCRA_FPX;
image.DIBChannels = 4;
image.DIBColor = IJL_RGBA_FPX;
break;
default:
// This catches everything else, but no
// color twist will be performed by the IJL.
image.DIBColor = (IJL_COLOR)IJL_OTHER;
image.JPGColor = (IJL_COLOR)IJL_OTHER;
image.DIBChannels = image.JPGChannels;
break;
}
image.DIBWidth = image.JPGWidth;
image.DIBHeight = image.JPGHeight;
image.DIBPadBytes = IJL_DIB_PAD_BYTES(image.DIBWidth,image.DIBChannels);
int imageSize = (image.DIBWidth * image.DIBChannels + image.DIBPadBytes) *
image.DIBHeight;
iImageData = new BYTE[ imageSize ];
strTemp.Format("%d",imageSize);
m_JPGFileInfo.m_MemorySize=strTemp;
if( iImageData == NULL )
{
return _UNEXPECTED_ERROR;
}
image.DIBBytes = iImageData;
//画像のデータを読み込む。
if( ijlRead( &image, IJL_JFILE_READWHOLEIMAGE ) != IJL_OK )
{
delete[] iImageData;
return _UNEXPECTED_ERROR;
}
if( ijlFree( &image ) != IJL_OK )
{
return _UNEXPECTED_ERROR;
}
if(image.DIBColor == IJL_RGBA_FPX)
{
RGBA_FPX_to_BGRA(iImageData,image.DIBWidth,image.DIBHeight);
}
}
catch(...)
{
EndWaitCursor();
ijlFree( &image );
delete[] iImageData;
m_iDisHeight=m_PreviewRect.Height();
m_iDisWidth=m_PreviewRect.Width();
m_Preview.SetBitmap(m_Defaultbitmap);
UpdateData(FALSE);
return _UNEXPECTED_ERROR;
}
// initializing incapsulated image with correct values
iImageData = iImageData;
imageDims.cx = image.DIBWidth;
imageDims.cy = image.DIBHeight;
imageChannels = image.DIBChannels; strTemp.Format("%d",image.DIBWidth);
m_JPGFileInfo.m_PictureWidth=strTemp;
strTemp.Format("%d",image.DIBHeight);
m_JPGFileInfo.m_PictureHeight=strTemp;
if(image.DIBChannels==3)
m_JPGFileInfo.m_BitCount="24";
else if(image.DIBChannels==3)
m_JPGFileInfo.m_BitCount="32";
else
m_JPGFileInfo.m_BitCount="8";
m_JPGFileInfo.m_FileFormat=GetSubsamplingStr(image.jprops.JPGSubsampling);
strTemp.Format("%d",image.jprops.jfif_app0_Xdensity);// jfif_app0_Xdensity jfif_app0_Ydensity
m_JPGFileInfo.m_WidthDPI= strTemp;
strTemp.Format("%d",image.jprops.jfif_app0_Ydensity);
m_JPGFileInfo.m_HeightDPI=strTemp;
m_JPGFileInfo.m_Author=image.jprops.JPGBytes;
try
{
BYTE* data = iImageData;
SIZE sizes = imageDims;
int nChannels = imageChannels;
BITMAPINFO m_bmi;
ZeroMemory( &m_bmi, sizeof( BITMAPINFO ) );
BITMAPINFOHEADER& bih = m_bmi.bmiHeader;
::ZeroMemory( &bih, sizeof( BITMAPINFOHEADER ) );
bih.biSize = sizeof( BITMAPINFOHEADER );
bih.biWidth = sizes.cx;
bih.biHeight = -sizes.cy;
bih.biCompression = BI_RGB;
bih.biPlanes = 1;
bih.biXPelsPerMeter = long(image.jprops.jfif_app0_Xdensity*100/2.54);
bih.biYPelsPerMeter = long(image.jprops.jfif_app0_Ydensity*100/2.54);
m_XPelsPerMeter = bih.biXPelsPerMeter;
m_YPelsPerMeter = bih.biYPelsPerMeter;
m_Channel = nChannels;
switch(nChannels)
{
case 3:
bih.biBitCount = 24;
break;
case 4:
bih.biBitCount = 32;
break;
default:
break;
}
if( m_Data != NULL )
delete[] m_Data;
int pad = IJL_DIB_PAD_BYTES(sizes.cx,nChannels);
int imageSize = (sizes.cx * nChannels + pad) * sizes.cy;
//From:読み込んだ画像データによってBMPファイルを生成し、表示する。
m_Data = new unsigned char[imageSize];
m_Depth = bih.biBitCount;
m_BytesPerLine = imageSize/abs(bih.biHeight);
if( m_Data == NULL )
return _UNEXPECTED_ERROR; ::ZeroMemory(m_Data,imageSize);
::CopyMemory(m_Data,data,imageSize);
m_BMPWidth = sizes.cx;
m_BMPHeight = abs(sizes.cy);
CDC dc;
dc.CreateDC("DISPLAY", "DISPLAY", 0, 0);
HBITMAP hBitmap = CreateDIBitmap(dc.m_hDC,&m_bmi.bmiHeader,CBM_INIT,m_Data,&m_bmi,DIB_RGB_COLORS|DIB_PAL_COLORS);//
if(m_hBitmap!=NULL)
DeleteObject(m_hBitmap);
m_hBitmap = (HBITMAP)CopyImage(hBitmap,IMAGE_BITMAP,m_BMPWidth,m_BMPHeight,LR_CREATEDIBSECTION);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
DeleteDC(dc);
if(!DisplayImage())
return _UNEXPECTED_ERROR;
delete []data;
// delete[] iImageData;
ijlFree( &image );
//To:読み込んだ画像データによってBMPファイルを生成し、表示する。
}
catch(...)
{
MessageBox(IMAGE_LOADER_READJPG_ERR,MSG_TITLE_ERR,MB_OK|MB_ICONSTOP);
return _UNEXPECTED_ERROR;
}
EndWaitCursor();
return _NO_ERR;
}
我再去调试