[英]Taking screenshots
我在截取屏幕截图时遇到问题。 一切都很好,但是我对1366x768分辨率有问题。 位图已损坏,我无法打开该文件。
HDC _dc = GetWindowDC(okno);
Szer_Wys(); //ustawia szerokosc i wysokosc aktywnego ekranu
dc = CreateCompatibleDC( 0 );
bm = CreateCompatibleBitmap( _dc, w, h );
SelectObject( dc, bm );
StretchBlt( dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY );
GetObject( bm, 84, buf );
ddd = GetDC( 0 );
dc2 = CreateCompatibleDC( ddd );
tagBITMAPINFO bit_info; //tworzy obiekt na strukture
bit_info.bmiHeader.biSize = sizeof( bit_info.bmiHeader ); //Rozmiar struktury bmiHeader (40 )
bit_info.bmiHeader.biWidth = w; //Szerokość bitmapy w pikselac
bit_info.bmiHeader.biHeight = h; //wysokosc bitmapy w pikselac
bit_info.bmiHeader.biPlanes = 1;
bit_info.bmiHeader.biBitCount = 24; //Liczba bitów kodujących piksel (RGB)
bit_info.bmiHeader.biCompression = 0; //0 - brak wewnętrznej kompresji
bit_info.bmiHeader.biSizeImage = 0;
h_createDIB = CreateDIBSection( dc, & bit_info, DIB_RGB_COLORS, & buf, 0, 0 );
GetDIBits( dc, bm, 0, h, buf, & bit_info, DIB_RGB_COLORS );
BITMAPFILEHEADER bit_header;
bit_header.bfType = MAKEWORD( 'B', 'M' ); //typ pliku
bit_header.bfSize = w * h * 3 + 54; //w * h * 3 kolory + nagłówek
bit_header.bfOffBits = 54;
BITMAPINFOHEADER bit_info_header;
bit_info_header.biSize = 40;
bit_info_header.biWidth = w;
bit_info_header.biHeight = h;
bit_info_header.biPlanes = 0;
bit_info_header.biBitCount = 24;
bit_info_header.biCompression = 0;
bit_info_header.biSizeImage = w * h * 3;
sciezka = obiekt.PobierzPathSCREEN() + obiekt.PobierzNazwe() + ".bmp";
ofstream plik(sciezka, ios::binary);
if(plik.good())
{
plik.write(reinterpret_cast<char*>(&bit_header), sizeof(bit_header));
plik.write(reinterpret_cast<char*>(&bit_info_header), sizeof(bit_info_header));
plik.write(reinterpret_cast<char*>(buf), w*h*3 );
}else cout<<"Blad pliku";
plik.close();
* Szer_Wys()*正在读取屏幕分辨率。
编辑
我将Szer_Wys()的内容更改为此:
void Zrzut::Szer_Wys()
{
RECT re;
GetWindowRect( okno, & re );
w = re.right, h = re.bottom;
while(w%4 != 0)
{
w++;
}
}
现在一切正常:)
请尝试以下操作:
位图中每行的字节数必须是4的倍数。
(3*1366)/4=1024,5 not a multiple of 4
您必须逐行保存它,并用每行两个字节填充它。 请记住,这会更改biSizeImage和bfSize成员,但不会更改图像的宽度和高度。 如果每个像素使用32位,则可以避免该问题。
您缺少以下事实:扫描线需要DWORD
对齐 (填充到下一个32位对齐边界)。
扫描线是DWORD对齐的,但RLE压缩的位图除外。 除了RLE压缩的位图以外,它们必须被填充以不能被4整除的扫描线宽度(以字节为单位)。 例如,一个10 x 10像素的24 bpp位图在每条扫描线的末尾将有两个填充字节。
因此,每条扫描线将为((w * 3) + 3) & ~3
字节,然后将其乘以h
以得到图像大小。 没有此填充,图像将损坏。
您还可以利用Windows SDK amvideo.h
提供的宏(它们还会再次说明格式):
// DIBSIZE calculates the number of bytes required by an image
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
#define DIBWIDTHBYTES(bi) (DWORD)WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount)
#define _DIBSIZE(bi) (DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight)
#define DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(_DIBSIZE(bi)) : _DIBSIZE(bi))
bit_info_header
,在写入文件时,您再次初始化结构bit_info_header
并且bit_info_header
在其中放置了不同的值。 例如,您在此处放置了零个平面,而平面数必须设置为1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.