HBITMAP hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&m_pBitmapInfoHeader, DIB_RGB_COLORS,(VOID **) (&pByte), NULL, 0) ;m_pBitmapInfoHeader是自己赋值的
pByte 是空指针
在读取jpeg文件,将里面数据变成rgb数据时用到,总是用不好,
能否解释一下

解决方案 »

  1.   

    用IJL库的代码
    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;
    }
      

  2.   

    HBITMAP hBitmap = CreateDIBitmap(dc.m_hDC,&m_bmi.bmiHeader,CBM_INIT,m_Data,&m_bmi,DIB_RGB_COLORS|DIB_PAL_COLORS);//  
      

  3.   

    谢谢 romanticist(让我拥抱你入梦)
    我再去调试