Android surfaceview使用——重载onTouchEvent

一、软件设计的基本原理和采用的主要方法(算法)与技术

算法:图像读入后,把数据放到数组中去。

灰度化用的是最终像素=0.3*R+0.59*B+0.11*G这个公式

反色使用255减去原像素得到最终像素

怀旧效果用的是0.393*R+0.769*G+0.189*B

高斯模糊用的是矩阵的卷积远算,算子是1/16{1,2,1,2,4,2,1,2,1},高斯模糊在模糊的同时有考虑每个像素的比重,所以边缘得以保留下来。

拉普拉斯用的3*3的算子,{1,1,1,1-8,1,1,1,1}

素描效果的实现参考了ps中的图层,第一个图层是灰度图,第二个图层是灰度图反相,然后用最小值滤波,最后是两个图层叠加。

图层的叠加,以灰度图为基色,处理过的图层为混合色,结果色=基色+基色*混合色/(255-混合色),最终会使基色图朝变亮的方向发展,对比度增加。

 

 

四、实现的过程与步骤

 

(用visio画出软件架构并解释)

 

五、遇到的困难与获得的主要成果

困难:Android平台的Bitmap的一些特性不太熟悉,Bitmap在内存中的存贮格式不太清楚,以及canvas的一些属性和ColorMatrix第一次接触。

主要成果:Bitmap加深了了解,Android平台绘图的基础知识有了一个大概的全貌,细节方面还要查api。

六、测试与运行记录

测试效果、结果

左边是ps上做的效果,右边是我的软件实现的效果。

七、结果分析与小结

开发任务基本上达到,图像处理的基础算法有了一个比较深入的了解,特别是大概实现了图像素描的算法,滤镜开发的基础算法也比较熟悉了,总的来说,收获很大。

八、附录(软件配置、含注释的程序模块核心代码)

public staticBitmap oldbmp(Bitmap bmp){
     intwidth=bmp.getWidth();
     intheight=bmp.getHeight();
     
    Config config=bmp.getConfig();
     Bitmap bitmap=bmp.createBitmap(width, height,Bitmap.Config.RGB_565);//创建一个新的bitmap
     intpixColor;
     intpixR,pixG,pixb;
     intnewColor;
     intnewr,newg,newb;
     int[]pixs=new int[width*height];
     bmp.getPixels(pixs, 0, width, 0, 0, width,height);//把bitmap中的像素提取到pixs数组中去
     for(int i=0;i<height;i++){
         
         for(int j=0;j<width;j++){
             pixColor=pixs[i*width+j];//分别得到rgb三个通道
             pixR=Color.red(pixColor);
             pixG=Color.green(pixColor);
             pixb=Color.blue(pixColor);
             newr=(int)(0.393 * pixR + 0.769 * pixG + 0.189* pixb);//怀旧效果的公式
             newb=(int)(0.272* pixR + 0.534 * pixG + 0.131 * pixb);
             newg=(int)(0.349 * pixR + 0.686 * pixG + 0.168* pixb);
             newColor=Color.argb(255, newr>255?255:newr,newg>255?255:newg, newb>255?255:newb);
             pixs[i*width+j]=newColor;
         }
     }
     bitmap.setPixels(pixs, 0, width, 0, 0, width,height);
     return bitmap;
 }
 
 
public staticBitmap gray(Bitmap bmp){
    int width=bmp.getWidth();
    int height=bmp.getHeight();
 Bitmap bitmap=bmp.createBitmap(width, height,Bitmap.Config.RGB_565);
     
     Canvas canvas=new Canvas(bitmap);//创建一个画布
     Paintpaint=new Paint();//创建一个画笔
     float[] data={(float) 0.3,(float) 0.59,(float)0.11,0,0,(float) 0.3,(float) 0.59,(float) 0.11,0,0,(float) 0.3,(float)0.59,(float) 0.11,0,0,(float) 0.3,(float) 0.59,(float) 0.11,0,0};//灰度图的颜色过滤矩阵
     ColorMatrix coma=new ColorMatrix(data);//以data为参数创建颜色过滤矩阵
     ColorMatrixColorFilter filter=new  ColorMatrixColorFilter(coma);//颜色过滤器
     paint.setColorFilter(filter);
     canvas.drawBitmap(bmp, 0, 0, paint);/在绘制bitmap
     return bitmap;
}
 
for(inti=1;i<height-1;i++){
        for(intj=1;j<width-1;j++){
           
            count=0;
            newr=newg=newb=0;
            for(int m=-1;m<2;m++){//高斯模糊的算法,3*3矩阵,用的算子是算子是1/16{1,2,1,2,4,2,1,2,1},高斯模糊在模糊的同时有考虑每个像素的比重,所以边缘得以保留下来
            for(int n=-1;n<2;n++){  
                pixColor=pixs[(i+m)*width+j+n];
            r=Color.red(pixColor);
            g=Color.green(pixColor);
            b=Color.blue(pixColor);
            newr+=r*data[count];//3*3矩阵每一个像素分别相乘
            newb+=b*data[count];
            newg+=g*data[count];
            count++;
            }
            }
            //temp=(int)sum;
            newr/=size;//除以16
            newb/=size;
            newg/=size;
            newr=Math.min(255, Math.max(0, newr));
            newg=Math.min(255, Math.max(0, newg));
            newb=Math.min(255, Math.max(0, newb));
            temp=Color.argb(255, newr, newg, newb);
            newpixs[i*width+j]=temp;
 
 
for(inti=1;i<height-1;i++){
    for(int j=1;j<width-1;j++){
        temp=255;
   
        for(intm=-1;m<2;m++){
            for(int n=-1;n<2;n++){//最小值滤波,3*3矩阵中的最小值  
                pixcolor=pixs[(i+m)*width+j+n];
            temp=temp>=pixcolor?pixcolor:temp;
           
    }
    }
        newpixs[i*width+j]=temp;
    }
}
 
int[]Cdata=new int[width*height];//原像素
int[]fdata=new int[width*height];//反色的像素
int[]temp=new int[width*height];
bmp.getPixels(Cdata,0, width, 0, 0, width, height);
for(inti=0;i<height;i++){
    for(int j=0;j<width;j++){
    pixColor=Cdata[i*width+j];//原像素
    r=Color.red(pixColor);
    g=Color.green(pixColor);
    b=Color.blue(pixColor);
    nr=255-r;//变反
    nb=255-b;
    ng=255-g;
    newColor=Color.argb(255, nr, ng, nb);
    fdata[i*width+j]=newColor;
   
   
    }
}
int minColor;
inttempr,tempb,tempg;
 
for(inti=1;i<height-1;i++){
    for(int j=1;j<width-1;j++){
        tempr=tempb=tempg=255;
        for(intm=-1;m<2;m++){
            for(int n=-1;n<2;n++){
//反色像素用最小值滤波
                pixColor=fdata[(i+m)*width+j+n];
            r=Color.red(pixColor);
    g=Color.green(pixColor);
    b=Color.blue(pixColor);
    tempr=r>tempr?tempr:r;
    tempg=g>tempg?tempg:g;
    tempb=b>tempb?tempb:b;
   
    //反色像素用最小值滤波
   
        }
        }
        pixColor=Cdata[i*width+j];
        r=Color.red(pixColor);
        g=Color.green(pixColor);
        b=Color.blue(pixColor);
        //原图像与反色并且最小值滤波的图像图层叠加,用颜色减淡模式
        tempr=(int) (r+r*tempr/(256-tempr));
        endr=tempr>=255?255:tempr;//颜色减淡的模式,结果色=基色+基色*混合色/(255—混合色)
图层的叠加,以灰度图为基色,处理过的图层为混合色,结果色=基色+基色*混合色/(255-混合色),最终会使基色图朝变亮的方向发展,对比度增加。
        tempg=(int)(g+g*tempg/(256-tempg));
        endg=tempg>=255?255:tempg;
        tempb=(int)(b+b*tempb/(256-tempb));
       endb=tempb>=255?255:tempb;
       
       
        minColor=Color.argb(255,endr, endg, endb);
   
    temp[i*width+j]=minColor;
        //min[Color=Color.argb(255,, green, blue)
       
    }
}   

Android surfaceview使用——重载onTouchEvent,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。