02. august 2005 - 19:59
Der er
9 kommentarer og
1 løsning
Splitte screenshot i dele
Hej...
Er ny i C++, men har lært syntaxen for sproget...(næsten) Nu mangler jeg så at finde ud af alle classerne osv.
Jeg har en funktion som giver mig et screenshot... men nu vil jeg splitte det i dele af 32*32...
Det vil jeg gøre med Array of Byte[][][1024] (Korrekt?)
Men jeg er ikke god i streams osv.
Går ud fra at det billede jeg får har en syntax der er nogenlunde ligesom dette:
RGBRGBRGBRGBRGB...
men hvis det er bitmap filformatet, så er der jo headers osv.
En der kan hjælpe mig her?
03. august 2005 - 14:05
#4
okay, altså det er et rent bitmap-fil hhm... dvs. hvis jeg gemte screenshotet direkte til en fil, ville det blive til en bmp-fil?
03. august 2005 - 20:15
#5
En bitmap fil indeholder en BITMAPFILEHEADER, en BITMAPINFOHEADER, måske en række farver og derpå data.
Jeg havde denne kode til at ligge, den tager et screendump og gemmer det i en fil (screen.bmp):
#include <windows.h>
#include <iostream>
#include <fstream>
BITMAPINFOHEADER WriteHeader(std::ostream &os, int aWidth, int aHeight, WORD aBitPixel)
{
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
unsigned int WordsPerLine = (aWidth*aBitPixel + 31)/32;
BitmapFileHeader.bfType = (('M' << 8) | 'B');
BitmapFileHeader.bfSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + 4*WordsPerLine*aHeight;
BitmapFileHeader.bfReserved1 = 0;
BitmapFileHeader.bfReserved2 = 0;
BitmapFileHeader.bfOffBits = 0x36 + 8;
BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth = aWidth;
BitmapInfoHeader.biHeight = aHeight;
BitmapInfoHeader.biPlanes = 1;
BitmapInfoHeader.biBitCount = aBitPixel;
BitmapInfoHeader.biCompression = BI_RGB;
BitmapInfoHeader.biSizeImage = 0;
BitmapInfoHeader.biXPelsPerMeter = 0;
BitmapInfoHeader.biYPelsPerMeter = 0;
BitmapInfoHeader.biClrUsed = 0;
BitmapInfoHeader.biClrImportant = 0;
os.write((char *)&BitmapFileHeader, sizeof(BitmapFileHeader));
os.write((char *)&BitmapInfoHeader, sizeof(BitmapInfoHeader));
return BitmapInfoHeader;
}
int main()
{
HDC dc = GetDC(0);
int Width = GetDeviceCaps(dc, HORZRES);
int Height = GetDeviceCaps(dc, VERTRES);
HDC MemDc = CreateCompatibleDC(dc);
HBITMAP BitMap = CreateCompatibleBitmap(dc, Width, Height);
SelectObject(MemDc, BitMap);
BitBlt(MemDc, 0, 0, Width, Height, dc, 0, 0, SRCCOPY);
std::ofstream File("screen.bmp", std::ios::binary);
BITMAP Bm;
GetObject(BitMap, sizeof(Bm), &Bm);
BITMAPINFOHEADER Header = WriteHeader(File, Width, Height, Bm.bmBitsPixel);
char *Buffer = new char [Width*Height*Bm.bmBitsPixel/8];
GetDIBits(MemDc, BitMap, 0, Height, Buffer, (BITMAPINFO *)&Header, DIB_RGB_COLORS);
File.write(Buffer, Height*Width*Bm.bmBitsPixel/8);
ReleaseDC(0, dc);
ReleaseDC(0, MemDc);
delete [] Buffer;
DeleteObject(BitMap);
return 0;
}
Jeg kan godt prøve at lave den om, så den deler billedet op i mindre dele.
04. august 2005 - 01:21
#6
Nej, spar dig besværet... er "konverteret" til C# som jeg programmerede i for noget tid siden også... sproget kan jeg bedre lide.. hhm... tror også selv jeg er skilled nok til at kunne håndtere det i C#... men hvis du programmere i C# Så må du da gerne lave den der :D :)