1. 程式人生 > >一種簡單的方法在程式中實現透明效果(JAVA)(原始碼)

一種簡單的方法在程式中實現透明效果(JAVA)(原始碼)

{
    
/*
     * 構建imageSrc的拷貝,象素顏色為mask的顯示為透明
     * 
     * @param imageSrc 原始影象
     * @param mask mask為Object的例項,因為如果imageSrc為灰度圖,或者為索引顏色圖,則mask應為指定
     *                 灰度或索引的數值。如果imageSrc是其他模式的影象,則使用一個Color物件指定顏色值
     * @return 返回imageSrc的拷貝,象素顏色為mask的顯示為透明
     
*/

    
publicstatic BufferedImage createImageByMaskColor(BufferedImage imageSrc, Object mask) 
{
        
int x = imageSrc.getWidth(null);
        
int y = imageSrc.getHeight(null);
        Raster rasterSrc 
= imageSrc.getRaster();
        BufferedImage imageDes 
=new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        
int[] src 
=null;
        
int[] des =newint[4];
        
int type = imageSrc.getType();
        
if (type == BufferedImage.TYPE_BYTE_GRAY) {
            
int cmask = (Integer)mask;
            
while (-->=0)
                
for (int j =0; j < y; ++j) {
                    src 
= rasterSrc.getPixel(x, j, (int[])
null);
                    
if (src[0== cmask)
                        des[
3=0;
                    
else{
                        des[
0= src[0];
                        des[
1= src[0];
                        des[
2= src[0];
                        des[
3=255;
                    }

                    rasterDes.setPixel(x, j, des);
                }

        }
elseif (type == BufferedImage.TYPE_BYTE_INDEXED) {
            
int cmask = (Integer)mask;
            ColorModel cm 
= imageSrc.getColorModel();
            Object data 
=null;
            
while (-->=0)
                
for (int j =0; j < y; ++j) {
                    src 
= rasterSrc.getPixel(x, j, (int[])null);
                    
if (src[0== cmask) {//透明
                        des[3=0;//
                    }
else{
                        data 
= rasterSrc.getDataElements(x, j, null);
                        
int argb = cm.getRGB(data);
                        Color color 
=new Color(argb, true);
                        des[
0= color.getRed();
                        des[
1= color.getGreen();
                        des[
2= color.getBlue();
                        des[
3=255;
                    }

                    rasterDes.setPixel(x, j, des);
                    
                }

        }
else{
            ColorModel cm 
= imageSrc.getColorModel();
            Color cmask 
= (Color)mask;
            Object data 
=null;
            
int maskR, maskG, maskB;
            maskR 
= cmask.getRed();
            maskG 
= cmask.getGreen();
            maskB 
= cmask.getBlue();
            
while (-->=0)
                
for (int j =0; j < y; ++j) {
                    data 
= rasterSrc.getDataElements(x, j, null);
                    
int rgb = cm.getRGB(data);
                    
int sr, sg, sb;
                    sr 
= (rgb &0xFF0000)>>16;
                    sg 
= (rgb &0xFF00)>>8;
                    sb 
= rgb &0xFF;
                    
if (sr != maskR || sg != maskG || sb != maskB) {
                        des[
0= sr;
                        des[
1= sg;
                        des[
2= sb;
                        des[
3=255;
                    }

                    
else
                        des[
3=0;
                    rasterDes.setPixel(x, j, des);
                }

        }
            
        
return imageDes;
    }

    
    
/*
     * 構建imageSrc的拷貝,象素顏色為mask的顯示為透明
     * 
     * @param imageSrc 原始影象
     * @param mask 無論原始影象的色彩模式為何種模式,mask統一傳入一個
     *                 Color型別的物件指定希望顯示為透明的色彩值
     * @return 返回imageSrc的拷貝,象素顏色為mask的顯示為透明
     
*/

    
publicstatic BufferedImage createImageByMaskColorEx(BufferedImage imageSrc, Color mask) {
        
int x, y;
        x 
= imageSrc.getWidth(null);
        y 
= imageSrc.getHeight(null);
        Raster rasterSrc 
= imageSrc.getRaster();
        BufferedImage imageDes 
=new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        
int[] src =null;
        
int[] des =newint[4];

        ColorModel cm 
= imageSrc.getColorModel();
        Color cmask 
= (Color)mask;
        Object data 
=null;
        
int maskR, maskG, maskB;
        maskR 
= cmask.getRed();
        maskG 
= cmask.getGreen();
        maskB 
= cmask.getBlue();
            
while (-->=0)
                
for (int j =0; j < y; ++j) {
                data 
= rasterSrc.getDataElements(x, j, null);
                
int rgb = cm.getRGB(data);
                
int sr, sg, sb;
                sr 
= (rgb &0xFF0000)>>16;
                sg 
= (rgb &0xFF00)>>8;
                sb 
= rgb &0xFF;
                
if (sr == maskR && sg == maskG && sb == maskB)
                    des[
3=0;
                
else{
                    des[
0= sr;
                    des[
1= sg;
                    des[
2= sb;
                    des[
3=255;
                }

                rasterDes.setPixel(x, j, des);
            }
        
        
return imageDes;    
    }

    
/*
     * 建立漸進透明的影象,
     * @param imageSrc imageSrc必須是一個單位元組灰度圖,
     *                    在生成的影象中原始影象的黑色區域將被視為透明,
     *                    透明度由黑色到白色逐漸降低,到白色時完全不透明
     * <b>createGrayImage()方法返回的BufferedImage物件不能作為這個方法輸入
     *            因為createGrayImage()方法返回的是一個四位元組灰度圖,而該方法的
     *            引數需要的是一個單位元組的灰度圖(雖然也很容易實現四位元組灰度圖

相關推薦

簡單方法程式實現透明效果(JAVA)(原始碼)

{    /**//*     * 構建imageSrc的拷貝,象素顏色為mask的顯示為透明     *      * @param imageSrc 原始影象     * @param mask mask為Object的例項,因為如果imageSrc為灰度圖,或者為索引顏色圖,則mask應為指定     

pytroch用自定義的tensor初始化nn.sequentiallinear或者conv層的簡單方法

話不多說,上程式碼,上面寫的很清楚。 import torch.nn as nn import torch net= nn.Sequential( nn.Linear(1024, 512), nn.ReLU(inplace=True), nn.Linear(512,

實現對gridview刪除行時彈出確認對話方塊的簡單方法

首先,在GridView的屬性對框話框中點選“Columns”進入它的“欄位”設計器。接著在“欄位”設計器中選擇以前已加上的那個CommandField“刪除”列,這時在它的屬性列表下會看到一個“將此它段轉換為 TemplateFied”的項,點選將它轉換為TemplateFied列。完後退出該欄位設計器,切

簡單的Android 全域性更換字型的方法

在我們開發Android程式的時候通常會遇到更改全域性字型的需求,我目前能想到的解決方案有三種,下面我們來進行逐一分析: 第一種方式就是自定義控制元件,毫無疑問這個一定能解決我們的問題,只需要把我們之前用的控制元件換成我們自定義的控制元件就好,缺點是如果是多種控制元件我們就

從檔案讀取內容,並去掉換行符'\n'的簡單方法

開啟檔案後,可以用readlines將每一行的內容讀取到一個“列表”中, 獲取列表中每個元素,利用字串的strip('\n')去掉換行符 例如: lines = fd.readlines() for line in lines: line=line.strip('

php生成excel的另簡單方法

.com com span 來看 nbsp pan blog table content 之前我用table的方式寫過excel,還用php-excel這個類庫寫過excel。今天,我再向大家推薦一個超級簡單的寫excel的方法。 代碼: $xstr = "問題id\t問

獲取當前格式化時間的簡單方法

Date.prototype.isLeapYear = function() { return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0))); } //--

呼叫jupyter notebook檔案內的函式簡單方法

python開發環境jupyter notebook良好的互動式和模組化受到很多python開發人員的青睞,但是jupyter notebook是以json格式儲存檔案內容的,而不是python檔案那樣的普通格式,所以不能直接被python解析器解析,如何呼叫.ipynb中的module也成為一個問

iOS處理耗時操作簡單方法

在開發過程中,我們經常會遇到一下耗時的操作,比如說檔案的上傳、下載、壓縮、解壓縮等過程,開發過藍芽的小夥伴都知道藍芽的操作也是一個耗時的操作,尤其是那些以藍芽為工具的專案,比如說藍芽在智慧家居中的使用,這些都是耗時的操作。有時候我們需要對這些耗時的操作精準的加以控制,這時候

malloc函式的簡單的原理性實現

malloc()是C語言中動態儲存管理的一組標準庫函式之一。其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標 malloc()工作機制 malloc函式的實質體現在,它有一個將

多執行緒的全域性資訊統計的簡單實現方式(java實現)

如果你學過作業系統,我想你肯定對原子操作不會陌生,著名的哲學家就餐問題大家估計也不會陌生。如果現在有一個多執行緒的程式,有一個公共的訪問變數,那麼想正確的控制這個公共變數的值,每個學過計算機的人的處理方式肯定是使用一些互斥量,或者鎖機制,或者訊號量的方法保證對公共變數的訪問

Activity任務棧的管理 -----銷燬前一個相同的activity(還有簡單方法實現)

需求:介面A跳轉到介面B,之後再跳轉到介面A,此時需要銷燬第一次建立的介面A,以此類推…. 思路:(在每次建立當前Activity的時候銷燬前部的activity即可,然後在添加當前activity的引用) 編寫ActivityManagement的

SpringBank 開發日誌 簡單的攔截器設計實現

exp bst 一個 pin factory span 之前 system request 當交易由Action進入Service之前,需要根據不同的Service實際負責業務的不同,真正執行Service的業務邏輯之前,做一些檢查工作。這樣的攔截器應該是基於配置的,與Se

mysql 的 not like 另簡化方法

ont pan 簡化 regex regexp from sel span rom 第一種 not like 方法 select * from table where `zongbu` not like ‘%北京%‘ and `zongbu` not like ‘%上海%‘

簡單的生產環境部署Node.js程序方法

set process 一次 ann 來安 環境配置 load 修改 evel 最近在部署Node.js程序時,寫了段簡單的腳本,發覺還挺簡單的,忍不住想與大家分享。 配置文件 首先,本地測試環境和生產環境的數據庫連接這些配置信息是不一樣的,需要將其分開為兩個文件存儲

簡單的對象賦值方法,定義實例後以{}賦值,比傳統方法更簡潔

method ott static set num arr nbsp st2 () public class Rectangle { public Point TopLeft { get; set; } public Point Botto

CCS5.5 Image Analyzer的使用方法

color .cn nes style 5.5 調試 pixel 參數 技術 摘要:在DSP圖像處理調試過程中,經常會用到實時圖像提取。用CCS讀取DSP芯片中的數據,然後通過Image Analyzer顯示。在CCS3.3設置方法相對比較簡單。但是在CCS5.5中過程比較

簡單的圖像修復方法

col nes gb2 tle .com splay 產生 end left 該方法可以用於美顏中的祛斑,通過快速叠代的方式去除斑點。 假設輸入圖像為: 計算方向權重: 對於其他方向,操作類似We。 最終的輸出為: 對要修復的區域,反復進行同樣的操作即可。 簡單

內存池的實現方法

返回 memory 內存 cast oca ID incr count delet 基本的數據結構 大圖:https://drive.google.com/file/d/1s5Y_xPB_k-gOXxC1iwG60Jx0kb8yyQ1b/view?usp=sharing

數獨問題的簡單演算法程式碼實現

五一期間無聊時想起去年考研複試有一道上機題目當時沒作出來,於是一時興起想重新拾起看看是當時太緊張,還是自己能力不足。然後發現這道題目還真稍微有些難度,相當於一道數獨問題(sudoku)的簡化版。自己想來想去也只能想到兩種演算法,一種是拿剩餘元素做全排列測試,一種是回溯法測試。最後只實現了一個全排