Créer un cadre photo avec un effet plastique


La présente page montre comment créer automatiquement un cadre photo en couleur présentant un effet "plastique". On utilise l'environnement de développement CodeBlocks et la librairie graphique OpenCV qui sont des produits libres (Remarque : La page Programmer avec CodeBlocks et OpenCV montre comment installer et mettre en oeuvre cet l’environnement.

Programme exemple

Explications

Le cadre présente les paramètres suivants regroupés en début de programme. Ces paramètres sont modifiables :

  • W : largeur image;
  • H : hauteur image;
  • d : largeur du cadre;
  • (b, g, r) : couleur du cadre ;
  • (b3, g3, r3) : couleur de la ligne intérieure.;

Lors de la créations des différentes parties du cadre, il faut veiller à faire varier les indices i et j entre les bonnes valeurs.

2

Code source

/* -------------
Créer un cadre photo avec
dégradé couleur
Auteur C.Turrier - Juin 2016
------------ */
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hppv
#include <iostream>
#include "stdio.h"
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
//--VALEURS MODIFIABLES
int W = 1200;//largeur image
int H = 800; //hauteur image
int d=20; //largeur cadre
unsigned char b=52;//blue cadre
unsigned char g=103;//green cadre
unsigned char r=82;//red cadre
unsigned char a=0;//alpha cadre
unsigned char b3=255;//blue ligne intéroeiure
unsigned char g3=255;//green ligne intéroeiure
unsigned char r3=255;//red ligne intéroeiure
int x = 1; //épassieur ligne intérieure
//------
int i, j ;
Mat m(H, W, CV_8UC4, Scalar(0,0,0,0));
Mat m2(H, W, CV_8UC4, Scalar(0,0,0,255));
int e= d/2;
//HAUT
a=55; ;
for(i = 0; i < e; i++){
for(j = i; j <W-i; j++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a+200/e;
}
a=255;
for(i = e; i <2*e; i++){
for(j = i; j <W-i; j++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a-255/e;
}
//GAUCHE
a=55;
for(j = 0; j < e; j++){
for(i = j; i <H-j; i++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a+200/e;
}
a=255; ;
for(j = e; j < 2*e; j++){
for(i = j; i <H-j; i++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;;
}
a = a-255/e;
}
//BAS
a=55; ;
for(i = H-2*e; i < H-e; i++){
for(j = H-i-1; j <W-H+i; j++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a+200/e;
}
a=255;
for(i = H-e; i < H-1; i++){
for(j = H-i-1; j <W-H+i; j++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a-255/e;
}
//DROIT
a=55;
for(j = W-1; j > W-e; j--){
for(i = W-j-1; i <=H-W+j; i++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a+200/e;
}
a=255; ;
for(j = W-e; j > W-2*e; j--){
for(i = W-j-1; i <=H-W+j; i++){
m.data[i*W*4+j*4] = b; m.data[i*W*4+j*4+1] = g; m.data[i*W*4+j*4+2] = r; m.data[i*W*4+j*4+3] = a;
}
a = a-255/e;
}
for(int i = 0; i < H; i++){
for(int j = 0; j < W; j++){
unsigned char m_aij = m.data[i*W*4 + j*4 + 3];
double alpha_ij = (double)m_aij/255;
m2.data [i*W*4 + 4*j] = m.data[i*W*4 + j*4]*(alpha_ij);
m2.data [i*W*4 + 4*j+1] = m.data[i*W*4 + j*4+1]*(alpha_ij);
m2.data [i*W*4 + 4*j+2] = m.data[i*W*4 + j*4+2]*(alpha_ij);
m2.data [i*W*4 + 4*j+3] = 255;
}}
for(int i = d; i < H-d; i++){
for(int j = d; j < W-d; j++){
m2.data [i*W*4 + 4*j] = 0;
m2.data [i*W*4 + 4*j+1] = 0;
m2.data [i*W*4 + 4*j+2] = 0;
m2.data [i*W*4 + 4*j+3] = 0;
}}
//ligne intérieure
int x0=d-1, y0=d-1, x1=W-d-1, y1=d-1, x2=W-d-1, y2=H-d-1, x3=d-1, y3=H-d-1;
line( m2, Point( x0, y0 ), Point( x1, y1), Scalar( b3, g3, r3, 255), x, 8 );//haut
line( m2, Point( x1, y1 ), Point( x2, y2), Scalar( b3, g3, r3, 255),x, 8 );//Bas
line( m2, Point( x2, y2 ), Point( x3, y3), Scalar( b3, g3, r3, 255), x, 8 );//Gauche
line( m2, Point( x3, y3 ), Point( x0, y0), Scalar( b3, g3, r3, 255), x, 8 );//Droit
//AFFICHAGE ET ENREGISTREMENT CALQUE 3
//=========
imshow("image", m2);
vector compression;
compression.push_back ( CV_IMWRITE_PNG_COMPRESSION);
compression.push_back (0) ;//0 (sans compression) -> 9 (compression max)
imwrite("C:/essai.png", m2, compression);
waitKey( 0 );
return(0);
}

Télécharger le code source main.cpp

Exécution du programme

Le programme enregistre le cadre dans le fichier "C:/cadre-couleur.png". Il est à noter que la transparence du cadre n'apparaît pas dans la fenêtre du programme (ceci est dû à une "limitation" de la fonction imshow) mais elle est bien présente, comme on peut le constater en ouvrant "C:/cadre-couleur.png" avec GIMP.

3

Utilisation

Le cadre ainsi créé peut être placé :

Exemple avec d=20, (g,b,r) = (52,103,82) et ligne intérieure blanche de 1px.

photo

Astuce : utiliser l'outil pipette de GIMP, sur la photo à encadrer, pour choisir judicieusement la couleur du cadre.

Exemple : rappel de la couleur la plus claire des piliers fleche d=25, (g,b,r) = (237,235,223) et ligne intérieure noire de 1px.

photo2