zoukankan      html  css  js  c++  java
  • 图像处理------透明混合

    基本原理:

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

     

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

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

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

    张不同的图像。


    两张源图像分别为:


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



    三:最终程序效果如下



    四:程序关键代码及解释

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

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

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

    1. public void setRGB(BufferedImage img, int x, int y, int width, int height, int[] pixelsData) {  
    2.         int type = img.getType();  
    3.         if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {  
    4.             img.getRaster().setDataElements(x, y, width, height, pixelsData);  
    5.         } else {  
    6.             img.setRGB(x, y, width, height, pixelsData, 0, width);  
    7.         }  
    8.     }  

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

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

    实现Alpha Blending的代码如下:

    1. float blendingRate = 0.5f;  
    2.     private void processPixels(int[] inPixelsOne, int[] inPixelsTwo, int[] outPixelsData, int width, int height) {  
    3.         int index = 0;  
    4.         for(int row=0; row<height; row++) {  
    5.             for(int col=0; col<width; col++) {  
    6.                 int ta = 0, tr = 0, tg = 0, tb = 0;  
    7.                 int rgb1 = inPixelsOne[index];  
    8.                 int rgb2 = inPixelsTwo[index];  
    9.                 ta = ((rgb1 >> 24) & 0xff) + ((rgb2 >> 24) & 0xff);  
    10.                 tr = ((rgb1 >> 16) & 0xff) + ((rgb2 >> 16) & 0xff);  
    11.                 tg = ((rgb1 >> 8) & 0xff) + ((rgb2 >> 8) & 0xff);  
    12.                 tb = (rgb1 & 0xff) + (rgb2 & 0xff);  
    13.                   
    14.                 int a = 0, r=0, g=0, b=0;  
    15.                 a = (int)(blendingRate *(float)ta);  
    16.                 r = (int)(blendingRate *(float)tr);  
    17.                 g = (int)(blendingRate *(float)tg);  
    18.                 b = (int)(blendingRate *(float)tb);  
    19.                   
    20.                 outPixelsData[index] = ((a << 24) & 0xFF000000)  
    21.                 | ((r << 16) & 0x00FF0000)  
    22.                 | ((g << 8) & 0x0000FF00)  
    23.                 | ((b) & 0x000000FF);  
    24.                 index++;  
    25.             }  
    26.         }  
    27.           
    28.     }  

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

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

    1. if (srcImageOne == null) {  
    2.     File file_001 = new File("D:\resource\350_001.png");  
    3.     srcImageOne = ImageIO.read(file_001);  
    4. }  
    5. if (srcImageTwo == null) {  
    6.     File file_002 = new File("D:\resource\350_002.png");  
    7.     srcImageTwo = ImageIO.read(file_002);  
    8. }  

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    LeetCode算法题-Unique Morse Code Words(Java实现)
    LeetCode算法题-Rotate String(Java实现)
    LeetCode算法题-Rotated Digits(Java实现)
    LeetCode算法题-Letter Case Permutation(Java实现)
    LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
    LeetCode算法题-Jewels and Stones(Java实现)
    LeetCode算法题-Toeplitz Matrix(Java实现)
    LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
    Linux 文件管理命令语法、参数、实例全汇总(一)
    实用 Linux 命令行使用技巧集锦
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706381.html
Copyright © 2011-2022 走看看