2010-10-21 12 views

Trả lời

16

Như bạn đã phát hiện, ::LoadBitmap (và mới hơn ::LoadImage) chỉ xử lý .bmp s. Đến nay, giải pháp đơn giản nhất là chuyển đổi hình ảnh của bạn thành .bmp.

Nếu hình ảnh có độ trong suốt, nó có thể được chuyển đổi thành bitmap ARGB 32 bit (đây là công cụ có tên là AlphaConv có thể chuyển đổi nó). Sau đó tải hình ảnh bằng cách sử dụng phương thức CImage lớp học LoadFromResource. Vượt qua CImage đến m_staticLogo.SetBitmap().

Nhưng nếu bạn thực sự cần nó là .png, có thể thực hiện được.

Phương pháp 1 (cách dễ dàng hơn): Tải .png từ tệp bằng cách sử dụng CImage::Load. Vượt qua CImage đến m_staticLogo.SetBitmap().

Cách 2 (cách khó khăn hơn): Load .png từ một nguồn tài nguyên bằng cách tải các tài nguyên vào một COM IStream và sử dụng CImage::Load. (LƯU Ý: CImage::LoadFromResource có vẻ hấp dẫn nhưng sẽ không hoạt động với đồ họa .png). Để nhận tài nguyên vào COM IStream, hãy xem this Codeproject article. Lưu ý bài viết hoạt động với Gdiplus::Bitmap nhưng phần quan trọng là làm thế nào để tạo ra các IStream, mà bạn sẽ có thể thích ứng cho CImage. Cuối cùng, chuyển số CImage đến m_staticLogo.SetBitmap().

Chỉnh sửa: Cập nhật để sử dụng CImage, dễ hơn Gdiplus::Bitmap.

+0

Tôi đã chuyển đổi tệp png thành bmp nhưng vấn đề là nền của hình ảnh không trong suốt nữa sau khi chuyển đổi. Có cách nào để chuyển đổi mà vẫn giữ nguyên nền trong suốt không? –

+0

Phương thức 1 hoạt động nhưng tôi muốn có đồ họa trong tệp tài nguyên. Phương pháp 2 quá khó đối với tôi. –

+0

Bạn có thể bảo toàn tính minh bạch bằng cách chuyển đổi '.png' thành 32 bit" ARGB "' .bmp'. Các công cụ tiêu chuẩn như Paint.NET sẽ không làm điều này. Tôi đã cập nhật bài viết bằng một công cụ hoạt động. Nó có thể trông lạ khi xem trong Visual Studio nhưng làm cho tốt. Điều này hoạt động tốt với nền một màu. Nó sẽ không hoạt động nếu bạn có một nền tảng phức tạp như một bức ảnh. – Nate

1

Bitmap và biểu tượng nó hỗ trợ. Không chắc chắn về png. Cách khác, Có thể bạn có thể thử những điều sau đây.

  1. mở png trong MS Sơn hoặc một số người xem khác.
  2. Sau đó sao chép phần hình ảnh từ đó.
  3. Tạo tài nguyên trong tài nguyên MFC.
  4. Dán hình ảnh được sao chép vào tài nguyên mới được tạo.
  5. Sử dụng id tài nguyên mới trong LoadBitmap.
0

Nếu bạn đang chuyển đổi tệp .png sang định dạng .bmp, bạn có thể kết thúc bằng hình ảnh rõ nét. Vì vậy, bắt WM_PAINT nhắn trong lớp hộp thoại và sử dụng

Graphics :: drawImage phương pháp

Để có được phương pháp này liên kết dự án của bạn với thư viện gdiplus.lib.

3

Đối với những người, những người cần giải pháp nhanh chóng, đây là một cách để tải tập tin png từ nguồn sử dụng GDI + (câu trả lời ban đầu cho chuẩn GDI từ đây - http://www.codeproject.com/Questions/377803/How-to-load-PNG-images-in-mfc):

bool GdiPlusUtils::LoadBitmapFromPNG(UINT uResourceID, 
    Bitmap** ppBitmapOut, HINSTANCE hInstance /*= NULL*/) 
{ 
    bool bRet = false; 

    if (!hInstance) 
     hInstance = AfxGetInstanceHandle(); 

    HRSRC hResourceHandle = ::FindResource(
     hInstance, MAKEINTRESOURCE(uResourceID), L"PNG"); 
    if (0 == hResourceHandle) 
    { 
     return bRet; 
    } 

    DWORD nImageSize = ::SizeofResource(hInstance, hResourceHandle); 
    if (0 == nImageSize) 
    { 
     return bRet; 
    } 

    HGLOBAL hResourceInstance = ::LoadResource(hInstance, hResourceHandle); 
    if (0 == hResourceInstance) 
    { 
     return bRet; 
    } 

    const void* pResourceData = ::LockResource(hResourceInstance); 
    if (0 == pResourceData) 
    { 
     FreeResource(hResourceInstance); 
     return bRet; 
    } 

    HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, nImageSize); 
    if (0 == hBuffer) 
    { 
     FreeResource(hResourceInstance); 
     return bRet; 
    } 

    void* pBuffer = ::GlobalLock(hBuffer); 
    if (0 != pBuffer) 
    { 
     CopyMemory(pBuffer, pResourceData, nImageSize); 
     IStream* pStream = 0; 
     if (S_OK == ::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream)) 
     { 
      *ppBitmapOut = new Bitmap(pStream); 
      pStream->Release(); 
      bRet = true; 
     } 
     ::GlobalUnlock(hBuffer); 
    } 
    ::GlobalFree(hBuffer); 

    UnlockResource(hResourceInstance); 
    FreeResource(hResourceInstance); 

    return bRet; 
} 

Bạn có thể thêm tập tin png như tài nguyên sử dụng lệnh Add Resource và trong bảng chọn Import.