Les images floues HTML5 doivent être utilisées dans le projet. Dans le passé, GDI était utilisé. Il existe des composants prêts à l'emploi dans GDI pour l'implémenter en HTML5.
1.createImageData()
2.getImageData()
3.putImageData()
Les trois fonctions ci-dessus peuvent être implémentées Pour l'utilisation et les secrets, veuillez vous rendre sur Baidu, je ne le répéterai pas. la description. Cela n'a pas beaucoup de sens.
Ce qui suit est le JS qui implémente l'algorithme flou. En fait, il existe un autre algorithme de niveau 2B qui est la matrice de distribution, qui augmente l'efficacité plusieurs fois, mais l'effet est très faible et l'effet de mise en drapeau n'est pas fort.
Code d'implémentation :
function stackBlurImage( imageID, canvasID, radius, blurAlphaChannel )
{
var img = document.getElementById( imageID );
var w = img.naturalWidth;
var h = img.naturalHeight;
var canvas = document.getElementById( canvasID );
canvas.style.width = w + "px";
canvas.style.height = h + "px";
canvas.width = w;
canvas.height = h;
var context = canvas.getContext("2d");
context.clearRect( 0, 0, w, h );
context.drawImage( img, 0, 0 );
if ( isNaN(radius) || radius < 1 ) return;
if ( blurAlphaChannel )
stackBlurCanvasRGBA( canvasID, 0, 0, w, h, radius );
else
stackBlurCanvasRGB( canvasID, 0, 0, w, h, radius );
}
function stackBlurCanvasRGBA( id, top_x, top_y, width, height, radius )
{
if ( isNaN(radius) || radius < 1 ) return;
radius |= 0 ;
var canvas = document.getElementById( id );
var context = canvas.getContext("2d");
var imageData;
try {
try {
imageData = context.getImageData( top_x, top_y, width, height );
} catch(e) {
essayez {
netscape.security.PrivilegeManager.enablePrivilege( "UniversalBrowserRead");
imageData = context.getImageData( top_x, top_y, width, height );
} catch(e) {
alert("Impossible d'accéder à l'image locale");
throw new Erreur("impossible d'accéder aux données d'image locales : " e);
return;
}
}
} catch(e) {
alert("Impossible d'accéder à l'image");
lancer une nouvelle erreur ("impossible d'accéder aux données d'image : " e);
}
var pixels = imageData.data;
var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum,
r_out_sum, g_out_sum, b_out_sum, a_out_sum,
r_in_sum, g_in_sum, b_in_sum, a_in_sum,
pr, pg, pb, pa, 🎜>
var div = rayon rayon 1 ;
var w4 = largeur << 2;
var widthMinus1 = largeur - 1;
var heightMinus1 = hauteur - 1;
var radiusPlus1 = rayon 1;
var sumFactor = radiusPlus1 * ( radiusPlus1 1 ) / 2;
var stackStart = new BlurStack();
var stack = stackStart;
for ( i = 1; i < div; i )
{
stack = stack.next = new BlurStack( );
if ( i == radiusPlus1 ) var stackEnd = stack;
}
stack.next = stackStart;
var stackIn = null;
var stackOut = null;
yw = yi = 0;
var mul_sum = mul_table[radius];
var shg_sum = shg_table[radius];
pour ( y = 0; y < hauteur; y )
{
r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
r_out_sum = radiusPlus1 * ( pr = pixels[yi] );
g_out_sum = radiusPlus1 * ( pg = pixels[yi 1] );
b_out_sum = radiusPlus1 * ( pb = pixels[yi 2] );
a_out_sum = radiusPlus1 * ( pa = pixels[yi 3] );
r_sum = sumFactor * pr;
g_sum = sumFactor * pg;
b_sum = sumFactor * pb;
a_sum = sumFactor * pa;
stack = Commencer ;
pour (i = 0; je &Lt ; rayonPlus1 ; i )
{
stack.r = pr;
stack.g = pg;
stack.b = pb;
stack.a;
stack = stack.next ;
}
pour ( i = 1; i < radiusPlus1; i )
{
p = yi (( widthMinus1 < i ? widthMinus1 : i ) << 2 );
r_sum = ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i );
g_sum = ( stack.g = ( pg = pixels[p 1])) * rbs;
b_sum = ( stack.b = ( pb = pixels[p 2])) * rbs;
a_sum = ( stack.a = ( pa = pixels[p 3])) * rbs;
r_in_sum = pr;
g_in_sum = pg;
b_in_sum = pb;
a_in_sum = pa;
stack = stack.next;
}
stackIn = stackStart;
stackOut = stackEnd;
pour ( x = 0; x < width; x )
{
pixels[yi 3] = pa = (a_sum * mul_sum) >> ; shg_sum;
if ( pa != 0 )
{
pa = 255 / pa;
pixels[yi] = ((r_sum * mul_sum &g) t;> shg_sum) * pa;
pixels[yi 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
pixels[yi 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
} else {
pixels[yi] = pixels[yi 1] = pixels[yi 2] = 0;
}
r_sum -= r_out_sum;
g_sum -= g_out_sum;
b_sum -= b_out_sum;
a_sum -= a_out_sum;
r_out_sum -= stackIn.r;
g_out_sum -= stackIn.g;
b_out_sum -= stackIn.b;
a_out_sum -= stackIn.a;
p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2;
r_in_sum += ( stackIn.r = pixels[p]);
g_in_sum += ( stackIn.g = pixels[p+1]);
b_in_sum += ( stackIn.b = pixels[p+2]);
a_in_sum += ( stackIn.a = pixels[p+3]);
r_sum += r_in_sum;
g_sum += g_in_sum;
b_sum += b_in_sum;
a_sum += a_in_sum;
stackIn = stackIn.next;
r_out_sum += ( pr = stackOut.r );
g_out_sum += ( pg = stackOut.g );
b_out_sum += ( pb = stackOut.b );
a_out_sum += ( pa = stackOut.a );
r_in_sum -= pr;
g_in_sum -= pg;
b_in_sum -= pb;
a_in_sum -= pa;
stackOut = stackOut.next;
yi += 4;
}
yw += width;
}
r_out_sum = radiusPlus1 * ( pr = pixels[yi]);
g_out_sum = radiusPlus1 * ( pg = pixels[yi 1]);
b_out_sum = radiusPlus1 * ( pb = pixels[yi 2] );
a_out_sum = radiusPlus1 * ( pa = pixels[yi 3]);
r_sum = sumFactor * pr;
g_sum = sumFactor * pg;
b_sum = sumFactor * pb;
a_sum = sumFactor * pa;
stack = stackStart;
for( i = 0; i < radiusPlus1; i )
{
stack.r = pr;
stack.g = pg;
stack.b = pb;
stack.a = pa;
stack = stack.next;
}
yp = largeur ;
pour ( i = 1; i <= rayon; i )
{
yi = ( yp x ) << 2;
r_sum = ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i );
g_sum = ( stack.g = ( pg = pixels[yi 1 ])) * rbs;
b_sum = ( stack.b = ( pb = pixels[yi 2])) * rbs;
a_sum = ( stack.a = ( pa = pixels[yi 3])) * rbs;
r_in_sum = pr;
g_in_sum = pg;
b_in_sum = pb;
a_in_sum = pa;
stack = stack.next;
if( i < heightMinus1 )
{
yp = width;
}
}
yi = x;
stackIn = stackStart;
stackOut = stackEnd ;
pour ( y = 0; y < hauteur; y )
{
p = yi << 2;
pixels[p 3] = pa = (a_sum * mul_sum) >> shg_sum;
if ( pa > 0 )
{
pa = 255 / pa;
pixels[p] = ((r_sum * mul_sum) >> shg_sum ) * pa;
pixels[p 1] = ((g_sum * mul_sum) >> shg_sum ) * pa;
pixels[p 2] = ((b_sum * mul_sum) >> shg_sum ) * pa;
} else {
pixels[p] = pixels[p 1] = pixels[p 2] = 0;
}
r_sum -= r_out_sum;
g_sum -= g_out_sum;
b_sum -= b_out_sum;
a_sum -= a_out_sum;
r_out_sum -= stackIn.r;
g_out_sum -= stackIn.g;
b_out_sum -= stackIn.b;
a_out_sum -= stackIn.a;
p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2;
r_sum += ( r_in_sum += ( stackIn.r = pixels[p]));
g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1]));
b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2]));
a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3]));
stackIn = stackIn.next;
r_out_sum += ( pr = stackOut.r );
g_out_sum += ( pg = stackOut.g );
b_out_sum += ( pb = stackOut.b );
a_out_sum += ( pa = stackOut.a );
r_in_sum -= pr;
g_in_sum -= pg;
b_in_sum -= pb;
a_in_sum -= pa;
stackOut = stackOut.next;
yi += width;
}
}
context.putImageData( imageData, top_x, top_y );
}
function stackBlurCanvasRGB( id, top_x, top_y, width, height, radius )
{
if ( isNaN(radius) || radius < 1 ) return;
radius |= 0 ;
var canvas = document.getElementById( id );
var context = canvas.getContext("2d");
var imageData;
try {
try {
imageData = context.getImageData( top_x, top_y, width, height );
} catch(e) {
essayez {
netscape.security.PrivilegeManager.enablePrivilege( "UniversalBrowserRead");
imageData = context.getImageData( top_x, top_y, width, height );
} catch(e) {
alert("Impossible d'accéder à l'image locale");
throw new Erreur("impossible d'accéder aux données d'image locales : " e);
return;
}
}
} catch(e) {
alert("Impossible d'accéder à l'image");
lancer une nouvelle erreur ("impossible d'accéder aux données d'image : " e);
}
var pixels = imageData.data;
var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum,
r_out_sum, g_out_sum, b_out_sum,
r_in_sum, g_in_sum, b_in_sum,
pr, pg, pb, rbs;
var div = rayon rayon 1;
var w4 = largeur << 2;
var widthMinus1 = largeur - 1;
var heightMinus1 = hauteur - 1;
var radiusPlus1 = rayon 1;
var sumFactor = radiusPlus1 * ( radiusPlus1 1 ) / 2;
var stackStart = new BlurStack();
var stack = stackStart;
for ( i = 1; i < div; i )
{
stack = stack.next = new BlurStack( );
if ( i == radiusPlus1 ) var stackEnd = stack;
}
stack.next = stackStart;
var stackIn = null;
var stackOut = null;
yw = yi = 0;
var mul_sum = mul_table[radius];
var shg_sum = shg_table[radius];
pour ( y = 0; y < hauteur; y )
{
r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0;
r_out_sum = radiusPlus1 * ( pr = pixels[yi] );
g_out_sum = rayonPlus1 * ( pg = pixels[yi 1] );
b_out_sum = radiusPlus1 * ( pb = pixels[yi 2] );
r_sum = sumFactor * pr;
g_sum = sumFactor * pg;
b_sum = sumFactor * pb;
stack = stackStart;
for( i = 0; je &Lt ; rayonPlus1 ; i )
{
stack.r = pr;
stack.g = pg;
stack.b = pb;
stack.next;
}
for( i = 1; i < radiusPlus1; i++ )
{
p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 );
r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i );
g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs;
b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs;
r_in_sum += pr;
g_in_sum += pg;
b_in_sum += pb;
stack = stack.next;
}
stackIn = stackStart;
stackOut = stackEnd;
for ( x = 0; x < width; x++ )
{
pixels[yi] = (r_sum * mul_sum) >> shg_sum;
pixels[yi+1] = (g_sum * mul_sum) >> shg_sum;
pixels[yi+2] = (b_sum * mul_sum) >> shg_sum;
r_sum -= r_out_sum;
g_sum -= g_out_sum;
b_sum -= b_out_sum;
r_out_sum -= stackIn.r;
g_out_sum -= stackIn.g;
b_out_sum -= stackIn.b;
p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2;
r_in_sum += ( stackIn.r = pixels[p]);
g_in_sum += ( stackIn.g = pixels[p+1]);
b_in_sum += ( stackIn.b = pixels[p+2]);
r_sum += r_in_sum;
g_sum += g_in_sum;
b_sum += b_in_sum;
stackIn = stackIn.next;
r_out_sum += ( pr = stackOut.r );
g_out_sum += ( pg = stackOut.g );
b_out_sum += ( pb = stackOut.b );
r_in_sum -= pr;
g_in_sum -= pg;
b_in_sum -= pb;
stackOut = stackOut.next;
yi += 4;
}
yw += width;
}
r_out_sum = radiusPlus1 * ( pr = pixels[yi]);
g_out_sum = radiusPlus1 * ( pg = pixels[yi 1]);
b_out_sum = radiusPlus1 * ( pb = pixels[yi 2] );
r_sum = sumFactor * pr;
g_sum = sumFactor * pg;
b_sum = sumFactor * pb;
stackStart;
pour( i = 0; i < rayonPlus1; i )
{
pile.r = pr;
pile.g = pg;
pile.b = pb;
pile = pile .suivant ;
}
yp = largeur;
for( i = 1; i <= rayon; i )
{
yi = ( yp x ) < &Lt ; 2;
r_sum = ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i );
g_sum = ( stack.g = ( pg = pixels[yi 1 ])) * rbs;
b_sum = ( stack.b = ( pb = pixels[yi 2])) * rbs;
r_in_sum = pr;
g_in_sum = b_in_sum = pb;
stack = stack.next;
if( i < heightMinus1 )
{
yp = }
}
yi = x;
stackIn = stackStart;
stackOut = stackEnd;
p = oui ≪≪ 2;
pixels[p] = (r_sum * mul_sum) >> shg_sum;
pixels[p 1] = (g_sum * mul_sum) >> shg_sum;
pixels[p 2] = (b_sum * mul_sum) >> shg_sum;
r_sum -= r_out_sum;
g_sum -= g_out_sum;
b_out_sum -= b_out_sum;
r_out_sum -= stackIn.r;
g_out_sum -= stackIn. g;
b_out_sum -= stackIn.b;
p = ( x (( ( p = y radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2;
r_sum = ( r_in_sum = ( stackIn.r = pixels[p]));
g_sum = ( g_in_sum = ( stackIn.g = pixels[p 1]));
b_sum = ( b_in_sum = ( stackIn.b = pixels[p 2]));
stackIn = stackIn.next;
r_out_sum = ( pr = stackOut.r );
g_out_sum = ( pg = stackOut.g );
b_out_sum = ( pb = stackOut.b );
r_in_sum -= pr;
g_in_sum -= pg;
b_ in_sum -= pb;
stackOut = stackOut.next;
yi = width;
}
}
context.putImageData( imageData, top_x, top_y );
>
fonction BlurStack()
this.r = 0;
this.g = 0;
this.b = 0;
this.a = 0;
this.next = null;
}