알파 채널 정보를 유지하면서 HBITMAP에서 Gdiplus::Bitmap을 만드는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/335273

  •  22-07-2019
  •  | 
  •  

문제

BitMap :: FromHbitMap 함수를 사용하여 새 GDIPLUS :: BITMAP을 만들 때 결과 비트 맵은 불투명합니다. 원래 HBITMAP의 부분 투명성은 보존되지 않습니다.

알파 채널 데이터를 가져오는 HBITMAP에서 Gdiplus::Bitmap을 만드는 방법이 있습니까?

도움이 되었습니까?

해결책 2

HBITMAP에서 비트맵을 생성할 때 GDI+는 결코 알파 채널을 통해 가져오지 않는다는 것이 밝혀졌습니다.

대답은 다음과 같습니다.

  • BITMAP 및 HBITMAP을 전달하는 GetObject를 사용하여 입력 HBITMAP의 너비와 높이(입력 비트맵이 DIB인 경우 픽셀 데이터)를 가져옵니다.
  • 32비트 PARGB 픽셀 형식으로 올바른 크기의 비트맵을 만듭니다.
  • LockBits를 사용하여 새 비트맵의 pixelData 메모리를 확보하세요.
  • GetObject에서 픽셀을 얻은 경우 memcpy를 사용하여 ARGB 값을 복사합니다.
  • 새 Bitmap에서 UnlockBits를 호출합니다.

내 경우 입력 HBITMAP의 형식은 입력 비트맵 픽셀 데이터에서 새 비트맵 픽셀 데이터로 직접 memcpy를 수행하는 데 적합합니다.

GetObject에서 입력 픽셀 데이터를 얻지 못한 경우 GetDIBits를 사용하여 올바른 형식의 복사본을 얻으십시오.

다른 팁

작업 코드가 지침보다 더 유용하다고 생각합니다.

#include <GdiPlus.h>
#include <memory>

Gdiplus::Status HBitmapToBitmap( HBITMAP source, Gdiplus::PixelFormat pixel_format, Gdiplus::Bitmap** result_out )
{
  BITMAP source_info = { 0 };
  if( !::GetObject( source, sizeof( source_info ), &source_info ) )
    return Gdiplus::GenericError;

  Gdiplus::Status s;

  std::auto_ptr< Gdiplus::Bitmap > target( new Gdiplus::Bitmap( source_info.bmWidth, source_info.bmHeight, pixel_format ) );
  if( !target.get() )
    return Gdiplus::OutOfMemory;
  if( ( s = target->GetLastStatus() ) != Gdiplus::Ok )
    return s;

  Gdiplus::BitmapData target_info;
  Gdiplus::Rect rect( 0, 0, source_info.bmWidth, source_info.bmHeight );

  s = target->LockBits( &rect, Gdiplus::ImageLockModeWrite, pixel_format, &target_info );
  if( s != Gdiplus::Ok )
    return s;

  if( target_info.Stride != source_info.bmWidthBytes )
    return Gdiplus::InvalidParameter; // pixel_format is wrong!

  CopyMemory( target_info.Scan0, source_info.bmBits, source_info.bmWidthBytes * source_info.bmHeight );

  s = target->UnlockBits( &target_info );
  if( s != Gdiplus::Ok )
    return s;

  *result_out = target.release();

  return Gdiplus::Ok;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top