2013-10-10 34 views
2

我需要將vtkImageData打印到打印機CDC。 我在回顧thisthis後纔想到這樣做。 一種是使用的VTK接口,並設置一個CImage的像素,然後繪製的CImage到CDC有沒有辦法將現有的像素數組轉換爲BITMAP而不復制所有像素?

CImage c_image; 
c_image.Create(dims[0], dims[1], 24); 
for (int y=0; y<dims[1]; y++) 
{ 
    for (int x=0; x<dims[0]; x++) 
    { 
    float r = i_image->GetScalarComponentAsFloat(extent[0] + x, extent[2] + dims[1] - y - 1, 0, 0); 
    float g = i_image->GetScalarComponentAsFloat(extent[0] + x, extent[2] + dims[1] - y - 1, 0, 1); 
    float b = i_image->GetScalarComponentAsFloat(extent[0] + x, extent[2] + dims[1] - y - 1, 0, 2); 
    c_image.SetPixelRGB(x, y, r, g, b); 
    } 
} 

另一種是用CreateDIBSection()然後該位圖附加到一個CImage並繪製CImageCDC

HBITMAP hBitmap = nullptr; 
    BITMAPINFOHEADER bmih; 
    bmih.biSize  = sizeof(BITMAPINFOHEADER); 
    bmih.biWidth = dims[0]; 
    bmih.biHeight = dims[1]; 
    bmih.biPlanes = 1; 
    bmih.biBitCount = i_image->GetNumberOfScalarComponents() * 8; 
    bmih.biCompression = BI_RGB ; 
    bmih.biSizeImage = 0; 
    bmih.biXPelsPerMeter = 10; 
    bmih.biYPelsPerMeter = 10; 
    bmih.biClrUsed =0; 
    bmih.biClrImportant =0; 

    BITMAPINFO dbmi; 
    ZeroMemory(&dbmi, sizeof(dbmi)); 
    dbmi.bmiHeader = bmih; 
    dbmi.bmiColors->rgbBlue = 0; 
    dbmi.bmiColors->rgbGreen = 0; 
    dbmi.bmiColors->rgbRed = 0; 
    dbmi.bmiColors->rgbReserved = 0; 
    void* bits = nullptr; 

    // Create DIB 
    hBitmap = CreateDIBSection(i_printer_dc_ptr->GetSafeHdc(), &dbmi, DIB_RGB_COLORS, &bits, NULL, 0); 
    if (hBitmap == nullptr) { 
     ::MessageBox(NULL, __T("Could not load the desired image image"), __T("Error"), MB_OK); 
     return; 
    } 
    ::memcpy(bits, i_image->GetScalarPointer(), i_image->GetNumberOfScalarComponents() * dims[0] * dims[1]); 
    c_image.Attach(hBitmap); 

這都需要複製的所有字節一次,然後打印到CDC。有沒有辦法避免這種中間複製,並直接將字節打印到CDC?或者只是創建一個指向現有字節而不復制它們的HBITMAP

回答

2

是的,您可以使用SetDIBitsToDevice()函數將位直接複製到DC。

備註對準的限制:

掃描線必須在一DWORD除了RLE壓縮的位圖對齊。

一個常見的問題是由此產生的位圖顛倒(因爲位圖本身在Windows中是自下而上的)。如果發生這種情況,請取消BITMAPINFO結構中的高度。

+0

謝謝。這工作並加快了一點點。我最終使用'StretchDIBits()'調整圖像大小。 –

相關問題