`
abc20899
  • 浏览: 934888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

相干图片处理的一些片段-Xfermode属性

 
阅读更多
http://www.myexception.cn/mobile/917390.html

1、PorterDuffXfermode
PorterDuff.Mode的十六种情况可以看APIDemos中的效果,唯一记录一下,做测试时候迷茫的地方

private  void drawIntoBitmap(Bitmap bm) {
        Canvas canvas = new Canvas(bm);
        Paint paint = new Paint();
        InputStream stream = null;
    try {
    stream = mContext.getAssets().open("icon.jpg");
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    bitmap = RoundActivity.getRoundCornerBitmap(bitmap);//只是获取一个圆角的图片
    stream = getResources().openRawResource(R.drawable.ic_launcher);
    Bitmap src = BitmapFactory.decodeStream(stream);
   
   
    canvas.drawBitmap(bitmap, 100, 100, paint);
    canvas.drawBitmap(bitmap, 0, 0, paint);
    //SRC_OVER与SRC模式相比,主要区别SRC_OVER是会有透明度影响。而DST的话,则是src区域不显示,不像SRC模式,只是src区域所占的地方,det区对应地方被覆盖
//Over 类型的MODE只有Config为ARGB,以及Alph8类型的位图才会有效果
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));
//只有src占用的区间才会用到Xfermode模式进行运算,而不是整个Canvas区域生效。当然可以指定dst区域.或着如下边注释行的方法,设置了dirst区域。
// canvas.drawBitmap(src,new Rect(0, 0, src.getWidth(), src.getHeight()),new Rect(0, 0, 200 , 200),paint);
canvas.drawBitmap(src, 0, 0,paint);
paint.setARGB(0x80, 0x0, 0xff, 0x0);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
paint.setTextSize(60)
;// paint.setShader(mShader);
paint.setTextAlign(Paint.Align.CENTER);//如果是这个属性,则drawtext中的x,y坐标指的是文字所占区域的中心
Paint.FontMetrics fm = paint.getFontMetrics();
//如果是文字的话,XFermode设置后,只有文字的轨迹占用的地方才会生效
canvas.drawText("text", bm.getWidth()/2, (bm.getWidth()-fm.ascent)/2, paint);

}


如图



2、AvoidXfermode

private void drawInBitmapAvoid(Bitmap bm) {
Canvas canvas = new Canvas(bm);
Paint paint = new Paint();
canvas.drawBitmap(mBitmap, new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()), new Rect(0, 0, bm.getWidth(), bm.getHeight()), paint);
paint.setARGB(0xff, 0xff, 0x00, 0x00);
//Mode.AVOID 模式下是给op-color不一样的地方才绘制
// 如果tolerance 即误差为0,或者说完全不一样,才会绘制
// 如果tolerance 即误差为255,或者说稍微不一样,就可以绘制
//这边有点拗口,看另外一个模式就明白了
paint.setXfermode(new AvoidXfermode(0xff505050, 0, AvoidXfermode.Mode.AVOID));;
canvas.drawCircle(0, 0, bm.getWidth()/2, paint);
paint.setXfermode(new AvoidXfermode(0xff505050, 255, AvoidXfermode.Mode.AVOID));;
canvas.drawCircle(bm.getWidth(), 0, bm.getWidth()/2, paint);
// 如果是Mode.TARGET模式,只给与op-color一样的像素点上绘制
//如果tolerance为0,即完全一样,才会给这个像素点绘制
//如果tolerance为255,即稍微一样一点,就会给这个像素点绘制
paint.setXfermode(new AvoidXfermode(0xff505050, 0, AvoidXfermode.Mode.TARGET));;
canvas.drawCircle(0, bm.getHeight(), bm.getWidth()/2, paint);
paint.setXfermode(new AvoidXfermode(0xff505050, 255, AvoidXfermode.Mode.TARGET));;
canvas.drawCircle(bm.getWidth(), bm.getHeight(), bm.getWidth()/2, paint);
}


如图



3、PixelXorXfermode


文档中说PixelXorXfermode implements a simple pixel xor (op ^ src ^ dst).  我自认为模块一和模块二效果会一样,但是实验结果不同。

这个类,我完全被他打败了。测试了一下午也没测出规律和原因来,如果有懂的,望不吝赐教
而且经常不同的是R值和B值互换,有时候又正常。真不知道哪里错了

        private void drawInBitmapPixel(Bitmap bm) {
Canvas canvas = new Canvas(bm);
Paint paint = new Paint();
int dst = 0xff00ffff;
paint.setColor(dst);
Rect rect = new Rect(0, 0, bm.getWidth(), bm.getHeight()/2-8);
canvas.drawRect(rect, paint);
int src = 0xffffff00;
int opr = 0xffff0000;

//模块一
paint.setXfermode(new PixelXorXfermode(opr));
paint.setColor(src);
canvas.drawRect(rect, paint);
//模块二
paint.setXfermode(null);
int result = opr^src^dst;
/*//R和B 互换  0x ff ff ff ff
// 取B值
int b = result&0x000000ff;
//取R值
int r = result&0x00ff0000;
//移动到对应位置
b = b<<16;
r = r>>16;
//过滤RB值
result = result&0xff00ff00;
//放入RB值
result |= r;
result |= b;*/
paint.setColor(result);
rect = new Rect(0,bm.getHeight()/2+8,bm.getWidth(),bm.getHeight());
canvas.drawRect(rect, paint);

paint.setXfermode(null);
paint.setTextSize(15);
paint.setTextAlign(Align.CENTER);
canvas.drawText("^color="+Integer.toHexString(paint.getColor()), bm.getWidth()/2, (bm.getHeight()-paint.getFontMetrics().ascent)/2, paint);
}

分享到:
评论

相关推荐

    地震动模拟合成程序.zip_H/V_地震动合成_地震动场模拟_相干_随机场

    利用谱表现方法,对地震动随机场进行模拟。其中相干函数采用经典H-V模型。

    关于多脉冲相干&非相干积累问题的探讨-仿真和实测数据实践 博文对应的代码和数据

    综上所述,这篇博客通过理论分析、Matlab仿真和实际数据处理,全面展示了多脉冲相干与非相干积累的概念、原理和应用。读者不仅可以从中理解这两种积累方式的差异,还能学习到如何使用Matlab进行信号处理,并了解实际...

    SSB的matlab仿真-相干解调-通信原理-基带调制

    通过对《甄嬛传》的音频信号进行SSB调制,最后用相干解调法进行解调。读取音频文件:通过audioread函数读取音频文件(m4a格式),获取消息信号 y 和采样率 Fs。时域波形绘制:画出消息信号的时域波形。消息信号频谱...

    部分相干圆偏振贝塞耳-高斯光束经高数值孔径透镜的聚焦

    研究了部分相干圆偏振贝塞耳-高斯光束经高数值孔径透镜的聚焦特性。基于德拜矢量积分理论, 分别推导出了部分相干圆偏振涡旋光束经过高数值孔径透镜聚焦以后的光强和偏振度表达式。根据数值模拟的结果, 比较了左旋和...

    车载毫米波雷达信号处理中的相干与非相干积累问题博文相对应的代码和数据

    本资源包含了与“车载毫米波雷达信号处理中的相干与非相干积累问题”相关的代码和数据,这些资料通常以Matlab语言编写,用于模拟和分析雷达信号的处理过程。 首先,我们要理解相干积累和非相干积累的概念。相干积累...

    2012年中科大-1.54μM光纤相干测风激光雷达研究-张飞飞【硕】

    相干测风激光雷达中一个核心的问题是从微弱的气溶胶后向散射信号中估计出风速。基于零均值复高斯随机过程协方差矩阵统计模型的后向散射信号,首先讨论了最大似然(离散谱峰值(风速估计算法的克拉美一罗下界与由信息...

    相干光调制--OM2210相干接收机(ICR)校准源.pdf

    相干光调制技术是光纤通信领域中一种重要的技术。它在实现高速率数据传输以及提高通信网络带宽效率方面发挥着至关重要的作用。相干接收机是一种能够解析调制信号波形和数据的设备,它主要用于光纤通信系统中的接收端...

    FSK.rar_FSK相干非相干_fsk 相干_fsk 相干非相干_fsk非相干_matlab-fsk非相干

    标题中的"FSK.rar"指的是一个关于FSK(Frequency Shift Keying,频率移键控)技术的压缩文件,其中包含了相干解调和非相干解调的实现。FSK是一种常用的数字调制技术,通过改变载波频率来表示二进制数据,即0或1。在...

    空间滤波和相干光学处理.ppt

    涉及高通,低通,带通和方向滤波器,以及相干光处理。位相型滤波器主要功能是用于观察位相物体,观察透明生物切片,检查透明光学元件内部折射率是否均匀,或检查抛光表面的质量

    asympPDC-master_asympPDC-master_部分相干_相干分析_偏相干_偏定向相干matlab代

    在IT领域,尤其是在信号处理和数据分析中,"asympPDC-master_asympPDC-master_部分相干_相干分析_偏相干_偏定向相干matlab代"这一标题涉及到一系列重要的概念和技术。首先,我们来详细解析这些关键词并探讨相关的...

    wtc-r12_相干分析_多小波分析_

    在IT领域,尤其是在信号处理和数据分析中,"相干分析"和"多小波分析"是两个重要的概念。这里,我们围绕这两个主题展开讨论,并结合提供的压缩包文件名,来解析其相关知识点。 首先,相干分析是一种研究两个或多个...

    双站MIMO雷达相干角估计的Esprit-Like算法

    双站MIMO雷达相干角估计的Esprit-Like算法研究涉及到雷达信号处理、阵列信号处理、MIMO雷达系统以及角度估计技术等多个领域。本文将重点介绍双站MIMO雷达系统中角度估计的重要性、传统ESPRIT算法及其局限性,以及...

    matlab做相干卷积信号处理

    本次讨论的核心是利用MATLAB进行相干卷积信号处理,这是信号处理领域的一个重要概念,涉及到信号分析、滤波器设计、频谱分析等多个方面。以下是对给定代码片段中涉及的MATLAB函数与信号处理知识点的深入解析。 ### ...

    阵列信号处理-ppt-廖桂生

    阵列信号处理-ppt-廖桂生,西电教授讲义,第一章:绪论 第二章:数学基础 第三章:空域滤波原理及算法 第四章:部分自适应处理技术 第五章:阵列信号的高分辨处理 第六章:相干信源的高分辨处理 第七章:最大似然与...

    相干光通信实时信号处理.pdf

    实时单载波相干光通信和实时相干光正交频分复用(OFDM)通信在处理方法和处理顺序上有所不同。实时相干光OFDM通信在接收端的信号处理首先在时域上进行,时间同步后进行频偏估计,然后通过快速傅里叶变换(FFT)转换...

Global site tag (gtag.js) - Google Analytics