• StretchDIBits在一些图像尺寸下失败


    StretchDIBits用来打印图像,但是由于某种未知的原因,当图像达到特定尺寸时,它会失败。

    图像数据从其他一些图像源以24位BGR格式加载到无符号int数组中。它可以在某些大小下工作,但根本无法工作。

    正在测试的当前尺寸为638x1014。如果将高度更改为1013,则可以正常工作,但由于某种原因,如果高度为1014,则会失败。

    unsigned int * buffer = new unsigned int[width * height * 3];
    
    // Fill buffer with image data...
    
    BITMAPINFOHEADER bi = { 0 };
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = width;
    bi.biHeight = height;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.
    
    StartPage(hdcPrint);
    SetMapMode(hdcPrint, MM_ISOTROPIC);
    SetWindowExtEx(hdcPrint, width, height, NULL);
    SetViewportExtEx(hdcPrint, width, height, NULL);
    SetViewportOrgEx(hdcPrint, 0, 0, NULL);
    
    StretchDIBits(hdcPrint, 0, 0, width, width, 0, 0, width, height, buffer, (BITMAPINFO *) &bi, DIB_RGB_COLORS, SRCCOPY);

    StretchDIBits 失败且打印结果为空白页时返回零

    原因: 图像宽度是错误的字节数。Windows要求每一行都是4字节的倍数;638*3是1914,这是2个字节(3是RGB,代表红绿蓝三个字节的像素)

    除了行中的最后一个像素,每个像素应该为3个字节。宽度应为1916,而不是1914,因为1916均匀地除以4,而1914则不

    解决方法: 用合适的图像宽度,可以被4整除的

  • 相关阅读:
    lists and Dictionaries
    捕获鼠标点击 位置移动
    Preventing and Event from Propagation Through a set of Nested Elements
    瀑布流
    Using Function Closures with Timers
    $.getJSON 的用法
    Overlay 遮罩层
    git常见问题
    spring 全局异常处理
    spring 事务
  • 原文地址:https://www.cnblogs.com/strive-sun/p/12188277.html
Copyright © 2020-2023  润新知