Bildredigering i c++

17Aug10

Det var ett tag sen jag skrev något om programmering här i bloggen så nu är det dags. Eftersom bloggen i största del numera handlar om foto, antar jag att det är på plats att låta min kod göra det samma. Problemet jag i dag tänkte lösa är hur man snyggt softar en bild. Principen är enkel om man jobbar i ett bildredigeringsprogram (tex Gimp).

  1. Öppna bilden.
  2. Duplicera.
  3. Välj översta lagret.
  4. Applicera gaussiskoskärpa på det nya lagret.
  5. Ställ in önskad opacitet
  6. Platta ut bilden och spara.

Inte så komplicerat, hur gör man då i C++? Jag valde att jobba med biblioteket Magick++ som är otroligt lätt att jobba med (men kunde vara lite bättre dokumenterat). Största problemet var att hitta dokumentation om hur jag ändrade opaciteten, men till slut gick det.

I C++ med Magick++ dlir det ungefär så här:

#include <Magick++.h>

int main(int argc, char **argv)
{
	Image Baselayer;
	Image Blurlayer;
	Baselayer.read("./minbild.jpg");
	Blurlayer = Baselayer;
	Blurlayer.gaussianBlur(0.0, 9.5);
	Blurlayer.opacity(MaxRGB*30/100); //30% opacitet
	Baselayer.composite(Blurlayer,CenterGravity,DissolveCompositeOp);
	Baselayer.write("./nyfil.jpg");
	return 0;
}
Givetvis ville jag inte ha så simpel kod (koden ovan är inte ens testad) utan jag ville ha en snygg klass som jag kan använda i senare projekt. Resultatet blev en snygg klass som för jobbet åt mig och är lätt att använda, klassen är testad med gtest för att säkerställa att den fungerar oberoende av andra klasser till 100%.
Klassens utseende:
class CImageSofter
{
	public:
		CImageSofter();
		virtual ~CImageSofter(){;}
		int LoadFile(const string &file);
		int BlurImage(double width, double sigma);
		/* p är opiciteten i % */
		int Composite(int p);
		int SaveImage(const string &file);
		string getErrMsg(){return err_msg;}

	private:
		Image Baselayer;
		Image Blurlayer;
		string err_msg;
};
Och ett litet exempel på hur klassen använd (klippt från unittestningen):
TEST(Composite, composite){
	CImageSofter soft;
	EXPECT_EQ(0, soft.LoadFile("./test.jpg"));
	EXPECT_EQ(0, soft.BlurImage(0.0, 9.5));
	EXPECT_EQ(0, soft.Composite(10));
	EXPECT_EQ(0, soft.SaveImage("./mintest_composite.jpg"));
}

Källkoden finn här på launchpad, för att kompilera koden krävs magick++ och gtest man måste även se till att man har en fil som heter “./minfil.jpg” och “./minfil.tif” i samma katalog som binärfilen för att testen ska fungera.

Resultatet kan bli något i stil med:

Båten.

Båten.

//Fredrik



No Responses Yet to “Bildredigering i c++”

  1. Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: