Skip navigation

FreeImage

Képek kezelése.

A példaprogramok némelyike képek feldolgozását végzi. Ehhez jó, ha van egy keretünk, ami tud képeket beolvasni, és kiírni.

A képek kezelésére mi a FreeImage függvénykönyvtárat javasoljuk, ami letölthető Ezen al inken.

A FreeImage számos szolgáltatást nyújt, amik közül nekünk nincs szükségünk mindegyikre. Ezért készítettünk egy fejléc-filet két függvénnyel, amikkel egyszerűen lehet képeket beolvasni és kiírni.

A segédfüggvények megtalálhatóak ai ImageIO.h fileban, vagy a lenti kódrészletekben.

Beolvasó

A beolvasó függvény fejléce az alábbi.

void readRGBImageFromFile(char* fileName, unsigned char* &bytes, int &w, int &h)

Négy paraméter vár, amelyek rendre

  • A beolvasni kívánt file neve;
  • Egy poninter, amely a visszatérés után a kiolvasott kép pixeleinek tömbjére fog mutatni. Ez a tömb 8 bites értékeket tárol;
  • Végül pedig a kép szélességének és magasságának kimeneti paraméterei.

A függvény a pixelek tömbjét automatikusan foglalja le. A kép méreteit pedig a "w" és "h" paramétereken kerültül adja vissza.

A visszaadott pixelek tömbje minden esetben byte-okat tartalmaz. Minden pixel 4 összefüggő byte-ban van kódolva BRGA (Blue, Green, Red, Alpha) csoportosítában.

A függvény teljes törzse itt látható:

void readRGBImageFromFile(char* fileName, unsigned char* &bytes, int &w, int &h)
{
	FreeImage_Initialise();

	FREE_IMAGE_FORMAT format = FreeImage_GetFileType(fileName, 0);
	FIBITMAP* image = FreeImage_Load(format, fileName);

	FIBITMAP* temp = image;
	image = FreeImage_ConvertTo32Bits(image);
	FreeImage_Unload(temp);

	unsigned int pitch = FreeImage_GetPitch(image);
	w = FreeImage_GetWidth(image);
	h = FreeImage_GetHeight(image);
	int lineWidth = w * 4;

	bytes = new unsigned char[h*w * 4];

	for (int i = 0; i < h; i++)
	{
		unsigned char* src = FreeImage_GetScanLine(image, i);
		unsigned char* dst = bytes + i*lineWidth;

		memcpy(dst, src, lineWidth);
	}

	FreeImage_Unload(image);

	FreeImage_DeInitialise();
}

Kiíró

A kiíró függvény fejléce az alábbi:

void writeRGBImageToFile(char* fileName, unsigned char* bytes, int w, int h)

Mint abeolvasó függvény, négy paraméter vár, amelyek rendre

  • A beolvasni kívánt file neve;
  • Egy poninter, amely a kép pixeleire mutat;
  • Végül pedig a kép szélessége és magassága.

A kiírandó kép pixel tömbjében minden pixelt 4 összefüggő byte-ban kell kódolni BRGA (Blue, Green, Red, Alpha) csoportosítában. Az átadott by-te ok számának meg kell egyzni a "w*h*4"-val vagyis a pixelszám négyszeresével.

A függvény teljes törzse itt látható:

void writeRGBImageToFile(char* fileName, unsigned char* bytes, int w, int h)
{
	FreeImage_Initialise();

	FREE_IMAGE_FORMAT format = FreeImage_GetFIFFromFilename(fileName);
	FIBITMAP *image = FreeImage_ConvertFromRawBits((BYTE*)bytes, w,
		h, w * 4, 32,
		0xFF000000, 0x00FF0000, 0x0000FF00);
	FreeImage_Save(format, image, fileName);

	FreeImage_Unload(image);

	FreeImage_DeInitialise();

	return;
}