1. Produkter
  2.   Bild
  3.   C++
  4.   CImg
 
  

Open Source C++ bibliotek för bildbehandling

Använd bildfilter, skapa, manipulera och rendera filformat för populära bilder med gratis C++ API.

CImg Library är ett bibliotek med öppen källkod som ger användbara funktioner för att ladda, spara, visa och bearbeta olika typer av bilder i C++-applikationer. CImg är ett mycket lätt och användarvänligt bibliotek. Det som är bra är att det undviker att hantera komplexa beroenden och problem med bibliotekskompatibilitet. Den är gjord av en enda huvudfil CImg.h som måste inkluderas i din C++-källa. Det hjälper utvecklare genom att utföra komplexa bildbehandlingsaktiviteter på bara några rader kod.

API:et stöder avancerade funktioner som hantering av 3D-bilder, transformering av bilder, bildfiltrering, bildanimering, bildbinarisering och mer. CImg-biblioteket är mycket bärbart och fristående. Det är lätt att använda på olika operativsystem med lätthet. Dessutom är den också mycket kompatibel med många C++-kompilatorer som Visual C++, ICC, G++, etc.

Previous Next

Komma igång med CImg

CImg Library är tillgängligt som .zip-paket som är plattformsoberoende. Den innehåller alla nödvändiga filer, tillsammans med olika exempel, som visar hur man använder bibliotekets funktioner och klasser.

Du måste lägga till dessa två rader i din C++ källkod, för att kunna arbeta med CImg.

Lägg till dessa rader för att CImg ska fungera

 #include "CImg.h" 
using namespace cimg_library 

Få den senaste versionen av CImg via Git

git clone --depth=1 https://github.com/GreycLab/CImg.git

C++ API för att skapa och ändra bilder

CImg open source-bibliotek låter C++-utvecklare skapa och manipulera olika typer av bilder i sina egna applikationer. Den stöder också hur man hanterar bildvisning och mushändelser. Först och främst måste du inkludera huvudfilerna och de enda rubrikfilerna i CImg-biblioteket. Det som är bra är att biblioteket minskar utvecklarens belastning genom att tillåta dem att skriva en mycket liten mängd kod. Observera också att källan fungerar perfekt på UNIX- och Windows-system.

Skapa bild via C++-biblioteket

 #include "CImg.h"
using namespace cimg_library;
int main() {
  CImg image("lena.jpg"), visu(500,400,1,3,0);
  const unsigned char red[] = { 255,0,0 }, green[] = { 0,255,0 }, blue[] = { 0,0,255 };
  image.blur(2.5);
  CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
  while (!main_disp.is_closed() && !draw_disp.is_closed()) {
    main_disp.wait();
    if (main_disp.button() && main_disp.mouse_y()>=0) {
      const int y = main_disp.mouse_y();
      visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.width()-1,y,0,0),red,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,1,image.width()-1,y,0,1),green,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,2,image.width()-1,y,0,2),blue,1,1,0,255,0).display(draw_disp);
      }
    }
  return 0;
}

Stöd för bildfiltrering

CImg-biblioteket ger stöd för bildfiltreringsprocessen. Ibland behöver vi hämta information om bilder och det är där bildfiltrering vanligtvis används. Bildfiltreringsprocessen är en av de vanligaste metoderna att tillämpa på bilder för att hämta information. För det mesta används filter vid borttagning av bildbrus, datorbildderivat, bildkantsförbättring, formanalys och mer.

Använd Fourier-filtrering i C++-appar

 void* item_fourier_filtering() {
  const CImg img = CImg(data_milla,211,242,1,3).RGBtoYCbCr().channel(0).resize(256,256);
  CImgList F = img.get_FFT();
  cimglist_apply(F,shift)(img.width()/2,img.height()/2,0,0,2);
  const CImg mag = ((F[0].get_pow(2) + F[1].get_pow(2)).sqrt() + 1).log().normalize(0,255);
  CImgList visu(img,mag);
  CImgDisplay disp(visu,"[#16] - Fourier Filtering (Click to set filter)");
  CImg mask(img.width(),img.height(),1,1,1);
  const unsigned char one[] = { 1 }, zero[] = { 0 }, white[] = { 255 };
  int rmin = 0, rmax = 256;
  while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
    disp.wait();
    const int
      xm = disp.mouse_x()*2*img.width()/disp.width() - img.width(),
      ym = disp.mouse_y()*img.height()/disp.height(),
      x = xm - img.width()/2,
      y = ym - img.height()/2;
    if (disp.button() && xm>=0 && ym>=0) {
      const int r = (int)std::max(0.0f,(float)std::sqrt((float)x*x + y*y) - 3);
      if (disp.button()&1) rmax = r;
      if (disp.button()&2) rmin = r;
      if (rmin>=rmax) rmin = std::max(rmax - 1,0);
      mask.fill(0).draw_circle(mag.width()/2,mag.height()/2,rmax,one).
        draw_circle(mag.width()/2,mag.height()/2,rmin,zero);
      CImgList nF(F);
      cimglist_for(F,l) nF[l].mul(mask).shift(-img.width()/2,-img.height()/2,0,0,2);
      visu[0] = nF.FFT(true)[0].normalize(0,255);
    }
    if (disp.is_resized()) disp.resize(disp.window_width(),disp.window_width()/2).display(visu);
    visu[1] = mag.get_mul(mask).draw_text(5,5,"Freq Min/Max = %d / %d",white,zero,0.6f,13,(int)rmin,(int)rmax);
    visu.display(disp);
  }
  return 0;
}
 Svenska