Avatar billede quiw Nybegynder
23. april 2009 - 14:59 Der er 5 kommentarer

Bitmap, læs og skriv

Hejsa Eksperter. Jeg har tjekket lidt rundt på google, og har endda også set på BertelBranders eksempel med bitmaps fra damb.dk
Men, jeg synes ikke at jeg kan få noget af det til at virke i dev-cpp .. Jeg vil gerne lave en funktion som kan læse en bitmap fil ind til hdc variabel, og derefter en funktion som kan gemme fra hdc til en bitmap fil. Er det muligt?

På forhånd tak.
Avatar billede bertelbrander Novice
23. april 2009 - 19:58 #1
Denne burde kunne vise et bitmap billede:
http://damb.dk/snip/bitmap.html

Her kan du læse om at hente fra en HDC og skrive til en fil:
http://damb.dk/screendump.php

Du skriver at du ikke kan få det til at virke. Hvad har du prøvet og hvad sker der?
Avatar billede quiw Nybegynder
23. april 2009 - 23:26 #2
Ud fra dine eksempler, har jeg forsøgt at stykke noget sammen:

#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;

UINT ImageWidth, ImageHeight;
HBITMAP Bitmap;

HDC dc;

HBITMAP LoadBMP(const char *FileName, UINT *Width, UINT *Height){
  HBITMAP BitMap = (HBITMAP )LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  if(!BitMap){
    printf("Failed to load image");
  }else{
    BITMAP BitmapInfo;
    GetObject(BitMap, sizeof(BITMAP), &BitmapInfo);
    *Width = BitmapInfo.bmWidth;
    *Height = BitmapInfo.bmHeight;
  }
  return BitMap;
}

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;
};


void BitmapToHDC(){
    // få HBITMAP Bitmap til at være i HDC dc.
}
void SaveHDC(const char *FileName){
  int Width = ImageWidth;
  int Height = ImageHeight;
  // gem indholdet af HDC dc som bitmap fil.
}

void TegnHDC(){
  // Burde jeg selv kunne klare med noget SetPixel();
}

int main(){
    Bitmap = LoadBMP("sample.bmp", &ImageWidth, &ImageHeight);
    BitmapToHDC();
    SaveHDC("sample2.bmp");
    system("PAUSE");
    return 0;
}


Men jeg stadig blank på, hvordan jeg skal få konverteret Bitmap til HDC, tegne på HDC og derefter gemme HDC som en .bmp
Avatar billede bertelbrander Novice
24. april 2009 - 01:11 #3
Jeg tror du skal fortælle mere om hvad det er du vil opnå. Hvad er det helt præcist du vil?
Avatar billede quiw Nybegynder
24. april 2009 - 11:23 #4
Jeg vil gerne indlæse et billede i form af BMP, derefter vil jeg gerne finde nogle pixels, ændre på dem, og gemme billedet som BMP. Det er helt præcist. Men hvordan det gøres, er jeg meget upræcis på.
Avatar billede bertelbrander Novice
24. april 2009 - 12:02 #5
Du kunne prøve at kikke på jdraw:
http://damb.dk/graphics.php

Det er en hel applikation til læsning, manipulering, visning og skrive billeder, både .bmp og .jpg.

Den del du har brug for, findes i ImageClass i image.h. Der er funktioner til læse og skrive filer. Der er en funktion kaldet GetAt der giver dig én af de tre farver i en enkelt pixel. Den kan du tage udgangspunkt i, og lave en SetAt der sætter en enkelt pixel.

Så vidt jeg husker kan du nøjes med at inkludere image.h og image.cpp i dit projekt, og enten linke til jpg biblioteket, eller klippe den del ud af koden.
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