📄 pixelblender.java
字号:
package imageproc;
import java.awt.image.*;
public class PixelBlender
{
public static final int SFACTOR_ZERO=0;
public static final int SFACTOR_255=1;
public static final int SFACTOR_DST_COLOR=2;
public static final int SFACTOR_255_MINUS_DST_COLOR=3;
public static final int SFACTOR_SRC_AlPHA=4;
public static final int SFACTOR_255_MINUS_SRC_AlPHA=5;
public static final int SFACTOR_DST_AlPHA=6;
public static final int SFACTOR_255_MINUS_DST_AlPHA=7;
public static final int SFACTOR_SRC_ALPHA_SATURATE=8;
public static final int DFACTOR_ZERO=0;
public static final int DFACTOR_255=1;
public static final int DFACTOR_SRC_COLOR=2;
public static final int DFACTOR_255_MINUS_SRC_COLOR=3;
public static final int DFACTOR_SRC_AlPHA=4;
public static final int DFACTOR_255_MINUS_SRC_AlPHA=5;
public static final int DFACTOR_DST_AlPHA=6;
public static final int DFACTOR_255_MINUS_DST_AlPHA=7;
int sfactor=SFACTOR_255;
int dfactor=DFACTOR_255;
boolean isReturnAlpha=false;
public PixelBlender()
{}
public PixelBlender(int sfactor,int dfactor)
{
this.sfactor=sfactor;
this.dfactor=dfactor;
if(sfactor>SFACTOR_SRC_ALPHA_SATURATE)
this.sfactor=SFACTOR_SRC_ALPHA_SATURATE;
if(dfactor>DFACTOR_255_MINUS_DST_AlPHA)
this.dfactor=DFACTOR_255_MINUS_DST_AlPHA;
}
public void setHint(int sfactor,int dfactor)
{
this.sfactor=sfactor;
this.dfactor=dfactor;
if(sfactor>SFACTOR_SRC_ALPHA_SATURATE)
this.sfactor=SFACTOR_SRC_ALPHA_SATURATE;
if(dfactor>DFACTOR_255_MINUS_DST_AlPHA)
this.dfactor=DFACTOR_255_MINUS_DST_AlPHA;
}
public boolean blend(int[] src,int[] dst,int scansize,int[] output)
{
if(scansize==0)
return false;
int height=src.length/scansize;
if((src.length>dst.length)||(src.length>output.length))
return false;
return(this.blend(src,dst,0,0,scansize,height,scansize,output));
}
public boolean blend(int[] src,int[] dst,int x,int y,int w,int h,int scansize,
int[] output)
{
if(scansize<=0)
return false;
if((src.length>dst.length)||(src.length>output.length))
return false;
int scanrows=src.length/scansize;
if((x>(scansize-1))||(y>scanrows-y))
return false;
int width=w;
int height=h;
if((x+w)>scansize)
width=scansize-x;
if((y+h)>scanrows)
height=scanrows-y;
ColorModel colorModel=ColorModel.getRGBdefault();
int i=0;
int j=0;
for(i=0;i<height;i++){
int indexBase=(y+i)*scansize;
for(j=0;j<width;j++){
int index=indexBase+x+j;
int rs,gs,bs,as,rd,gd,bd,ad;
rs=colorModel.getRed(src[index]);
gs=colorModel.getGreen(src[index]);
bs=colorModel.getBlue(src[index]);
as=colorModel.getAlpha(src[index]);
rd=colorModel.getRed(dst[index]);
gd=colorModel.getGreen(dst[index]);
bd=colorModel.getBlue(dst[index]);
ad=colorModel.getAlpha(dst[index]);
output[index]=this.blend(rs,gs,bs,as,rd,gd,bd,ad);
}
}
return true;
}
private int blend(int rs,int gs,int bs,int as,int rd,int gd,int bd,int ad)
{
int s_rgba[]=new int[4];
int d_rgba[]=new int[4];
int r,g,b,a;
switch(this.sfactor){
case SFACTOR_ZERO:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=0;
break;
case SFACTOR_255:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=255;
break;
case SFACTOR_DST_COLOR:
s_rgba[0]=rd;
s_rgba[1]=gd;
s_rgba[2]=bd;
s_rgba[3]=ad;
break;
case SFACTOR_255_MINUS_DST_COLOR:
s_rgba[0]=255-rd;
s_rgba[1]=255-gd;
s_rgba[2]=255-bd;
s_rgba[3]=255-ad;
break;
case SFACTOR_SRC_AlPHA:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=as;
break;
case SFACTOR_255_MINUS_SRC_AlPHA:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=255-as;
break;
case SFACTOR_DST_AlPHA:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=ad;
break;
case SFACTOR_255_MINUS_DST_AlPHA:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=255-ad;
break;
case SFACTOR_SRC_ALPHA_SATURATE:
s_rgba[0]=s_rgba[1]=s_rgba[2]=Math.min(as,255-ad);
s_rgba[3]=255;
break;
default:
s_rgba[0]=s_rgba[1]=s_rgba[2]=s_rgba[3]=255;
break;
}
switch(this.dfactor){
case DFACTOR_ZERO:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=0;
break;
case DFACTOR_255:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=255;
break;
case DFACTOR_SRC_COLOR:
d_rgba[0]=rs;
d_rgba[1]=gs;
d_rgba[2]=bs;
d_rgba[3]=as;
break;
case DFACTOR_255_MINUS_SRC_COLOR:
d_rgba[0]=255-rs;
d_rgba[1]=255-gs;
d_rgba[2]=255-bs;
d_rgba[3]=255-as;
break;
case DFACTOR_SRC_AlPHA:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=as;
break;
case DFACTOR_255_MINUS_SRC_AlPHA:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=255-as;
break;
case DFACTOR_DST_AlPHA:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=ad;
break;
case DFACTOR_255_MINUS_DST_AlPHA:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=255-ad;
break;
default:
d_rgba[0]=d_rgba[1]=d_rgba[2]=d_rgba[3]=255;
break;
}
r=(rs*s_rgba[0]+rd*d_rgba[0])/255;
g=(gs*s_rgba[1]+gd*d_rgba[1])/255;
b=(bs*s_rgba[2]+bd*d_rgba[2])/255;
a=(as*s_rgba[3]+ad*d_rgba[3])/255;
r=(r<0)?0:((r>255)?255:r);
g=(g<0)?0:((g>255)?255:g);
b=(b<0)?0:((b>255)?255:b);
a=(a<0)?0:((a>255)?255:a);
if(this.isReturnAlpha)
return((a<<24)|((r<<16)|(g<<8)|b));
else
return(0xFF000000|((r<<16)|(g<<8)|b));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -