2017-03-22 17 views
0

GdiPlus :: Bitmap 개체가 있고이 개체를 QPixmap으로 변환하는 함수를 만들어야합니다. 저는 Qt 5.8.0을 사용하고 있으며, 성능은 제 관심사입니다. 이 온라인에 대해서는 아무 것도 찾을 수 없으며 GDI + 이미지를 QImages로 검색 할 수도 있습니다. 픽셀 데이터에 액세스 할 필요가 없으므로 QWidget에 표시 될 수있는 GDI + 비트 맵을 변환해야합니다.GDI Plus 비트 맵을 QPixmap으로 변환

내가 찾은 가장 유망한 해결책은 QtWin에서 fromHBitMap()을 사용하는 것입니다 : http://doc.qt.io/qt-5/qtwin.html#fromHBITMAP, 그러나 나는 지식/경험이 비트 맵에 대한 핸들을 이해할 수 있도록 필요가 없습니다.

답변

0

이 나는 ​​빨간색과 파란색 바이트를 뒤집어 곳이 일을하는 방법을 가지고, 다음 QPixmap에에는 GDIPlus :: 비트 맵에서 변환하려면 다음 코드를 사용 느린 속도로 실행하려면 60 밀리 초가 걸렸습니다. 그래서 내 새로운 방법은 Gdiplus :: Bitmap을 파일로 저장하고 그 파일의 경로를 사용하여 QPixmap의 생성자에서 읽는 것입니다. 이 방법은 훨씬 빠르고 약 5 밀리 초입니다.

QPixmap getAsQPixmap(GdiPlus::Bitmap bitmap) 
{ 
    std::string path = "C:/path_to_img.....png"; 

    // One of my functions to unlock the Gdi+ bitmap 
    _unlockGdiPlusBitmap(); 

    // Get Clsid 
    CLSID pngClsid; 
    getEncoderClsid(format_mime, &pngClsid); 

    // Save bitmap 
    // stringToWString() was a function that I wrote to convert a standard string to be a wide string 
    bitmap->Save(stringToWString(path).c_str(), static_cast<const CLSID*>(&pngClsid)); 

    // Lock bitmap 
    _lockGdiPlusBitmap(); 

    // Create the QPixmap 
    QPixmap new_img(path); 

    return new_img; 
} 
0

당신의 손에는 "비트 맵"개체가 있다고 가정합니다. 또한 개발 환경이 "Windows 프로그래밍"과 "Qt"를 모두 지원한다고 가정합니다.

위의 가정을 토대로 "비트 맵"에서 HICON을 가져 와서 "QPixmap QtWin::fromHICON(HICON icon"로 전달할 수 있습니다.

단계 :

먼저 당신은 "Gdiplus.h"를 포함해야합니다. "QtWin"도 포함하십시오.

HICON hIcon; 
Status st = <<Your Bitmap Object>>.GetHICON(&hIcon); 
QPixmap pixM = QtWin::fromHICON(hIcon); 

시도해보십시오. 위의 코드는 테스트되지 않았습니다. 아이디어를 제공합니다.

0

나는 픽셀 데이터

당신은하지 않습니다에 액세스 할 필요가 없습니다,하지만 Qt는 가장 확실하게한다. Qt는 위젯 렌더링에 GDI를 사용하지 않고 QImage에서 작동하는 래스터 백엔드를 사용합니다. 후드에서 QPixmapQImage의 래퍼이며 이미지 데이터를 복사하지 않으므로 둘 사이의 변환은 저렴합니다.

따라서 어떤 경로를 선택하든 QPixmap의 형태 일지라도 어느 시점에 QImage이 포함됩니다. 그러나,

QPixmap getAsQPixmap(Gdiplus::Bitmap bitmap) 
{ 
    // One of my functions to flip blue and red bytes of the image 
    _flipBlueWithRed(); 

    // m_pBytes is a pointer to an unsigned char that marks the start of the image 
    // It was retrieved from locking the Gdiplus::Bitmap 
    auto result = QPixmap::fromImage(QImage(m_pBytes, getWidth(), getHeight(), QImage::Format_RGB888)); 

    // Restore data back to original state 
    _flipBlueWithRed(); 

    return result; 
} 

이 방법