图像处理之透明混合 - Alpha Blending效果

简介: 图像处理之透明混合 - Alpha Blending效果

基本原理:


图像的透明混合有个专属名词– Alpha Blending



对任意两张图像可以合成为一张图像,合成图像的像素取值根据数学公式:


RGB3 = (1- a) * RGB1 + a * RGB2


其中a为混合透明度取值范围[0, 1]之间, RGB3为目标像素值, RGB1与RGB2的值分别来自两


张不同的图像。



两张源图像分别为:

0_1320847524xDId.png


第二张源图像是房屋设计图

0_1320847531ut27.png



三:最终程序效果如下


0_1320847673wD07.png


四:程序关键代码及解释


获取BufferedImage对象中像素数据的代码如下:

public void getRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {
    int type = img.getType();
    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
      img.getRaster().getDataElements(x, y, width, width, pixelsData);
    } else {
      img.getRGB(x, y, width, height, pixelsData, 0, img.getWidth());
    }
  }

将处理后的像素数组写到新创建的BufferedImage对象中的代码如下:

public void setRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {
    int type = img.getType();
    if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
      img.getRaster().setDataElements(x, y, width, height, pixelsData);
    } else {
      img.setRGB(x, y, width, height, pixelsData, 0, width);
    }
  }


创建一个新BufferedImage对象代码如下:

alphaBlendingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

实现Alpha Blending的代码如下:

float blendingRate = 0.5f;
  private void processPixels(int[] inPixelsOne, int[] inPixelsTwo, int[] outPixelsData, int width, int height) {
    int index = 0;
    for(int row=0; row<height; row++) {
      for(int col=0; col<width; col++) {
        int ta = 0, tr = 0, tg = 0, tb = 0;
        int rgb1 = inPixelsOne[index];
        int rgb2 = inPixelsTwo[index];
        ta = ((rgb1 >> 24) & 0xff) + ((rgb2 >> 24) & 0xff);
                tr = ((rgb1 >> 16) & 0xff) + ((rgb2 >> 16) & 0xff);
                tg = ((rgb1 >> 8) & 0xff) + ((rgb2 >> 8) & 0xff);
                tb = (rgb1 & 0xff) + (rgb2 & 0xff);
                
                int a = 0, r=0, g=0, b=0;
                a = (int)(blendingRate *(float)ta);
                r = (int)(blendingRate *(float)tr);
                g = (int)(blendingRate *(float)tg);
                b = (int)(blendingRate *(float)tb);
                
                outPixelsData[index] = ((a << 24) & 0xFF000000)
        | ((r << 16) & 0x00FF0000)
        | ((g << 8) & 0x0000FF00)
        | ((b) & 0x000000FF);
                index++;
      }
    }
    
  }

本例中,为了简化计算假设alpah blending系数为0.5

加载/读取图像文件的代码如下:

        if (srcImageOne == null) {
          File file_001 = new File("D:\\resource\\350_001.png");
          srcImageOne = ImageIO.read(file_001);
        }
        if (srcImageTwo == null) {
          File file_002 = new File("D:\\resource\\350_002.png");
          srcImageTwo = ImageIO.read(file_002);
        }
相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
NeurIPS 2024:拆解高复杂运筹问题的砖石,打破数据稀缺的瓶颈,中科大提出高质量运筹数据生成方法
中国科学技术大学团队在NeurIPS 2024提出MILP-StuDio方法,通过拆解与重构MILP实例的块结构生成高质量数据,解决MILP领域数据稀缺问题。该方法保持实例可行性和计算难度,实验表明可将求解时间减少超10%。尽管存在块结构识别依赖和问题类型覆盖局限,但仍为提升MILP求解器性能提供新思路。
144 8
|
10月前
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
1278 12
|
11月前
|
网络协议 算法 数据库
|
12月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
594 0
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
349 0
|
SQL 存储 数据库连接
SqlAlchemy 2.0 中文文档(二十二)(1)
SqlAlchemy 2.0 中文文档(二十二)
193 2
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
375 0
|
网络协议 安全 文件存储
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
320 0
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
|
安全 网络协议 Java
如何读懂接口文档,简单易懂
一份设计得当的接口文档会用自己的方式回答上述问题,它通常会包含以下要素: 接口简介(回答接口是干嘛用的?) 定义请求协议(回答接口怎么用?) 请求地址源 请求方式 请求参数 返回参数示例(回答接口后的返回结果是什么?) 状态码
如何读懂接口文档,简单易懂
|
Java Maven
解决Maven依赖全部失败
解决Maven依赖全部失败
245 0