⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pixelblender.java

📁 用纯java技术实现了对图像锐化、模糊、边缘、灰度等操作功能
💻 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 + -