Avatar billede mysitesolution Nybegynder
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?
Avatar billede bertelbrander Novice
02. august 2005 - 20:14 #1
Det er ikke helt simpelt.

Der er header og så data. Formatet af data afhænger af antal bits pr. pixel. Man læser billedet nede fra og op. For hver linie data er der (måske) alignments bytes.

Du kunne prøve at kikke på jdraw, som du finder her:
http://home20.inet.tele.dk/midgaard/sample.html#images
Avatar billede bertelbrander Novice
02. august 2005 - 20:16 #2
Avatar billede krismort Nybegynder
02. august 2005 - 21:19 #3
du kan måske bruge DevIL der er så mange mærkelige funktioner til at indlæse forskellige billeder og behandle dem. skulle ikke undre mig hvis der findes noget til at splitte et billed op med
Avatar billede mysitesolution Nybegynder
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?
Avatar billede bertelbrander Novice
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.
Avatar billede mysitesolution Nybegynder
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 :)
Avatar billede bertelbrander Novice
04. august 2005 - 01:25 #7
Jeg kan ikke C#
Avatar billede mysitesolution Nybegynder
17. september 2005 - 15:08 #8
opret svar
Avatar billede bertelbrander Novice
17. september 2005 - 17:51 #9
Jeg sampler ikke på point.
Avatar billede mysitesolution Nybegynder
20. september 2005 - 08:15 #10
okay
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester