讀取圖片裡的pixel後並做運用,利用BufferedImage的getRGB及setRGB功能就可以達成目的。
開頭先說明,如果每個pixel都直接讀取後運算再直接存進源圖片並顯示的話,會非常消耗運算效能,所以這邊先把算好的值存在另一個image,等全部算好後再一次顯示。
取得圖檔後,因為需要把R、G、B分開運用,所以用Color來存RGB數值。
Color color=new Color(image.getRGB(x,y));
這邊示範的是把圖片轉換成灰色階,補充一點,RGB的黑白色都是三個顏色同樣數值,例如黑色(0,0,0)、白色(255,255,255),所以這邊把三個直取出後加總除三。
int tmp=(color.getRed()+color.getGreen()+color.getBlue())/3;
接著把算好的值設定進新的Color裡,用new Color(R,G,B)來實現。
Color tmpcol=new Color(tmp,tmp,tmp);
最後把Color的RGB值set進存改變後的圖片的Image就行了。
tmpIma.setRGB(x,y,tmpcol.getRGB());
以下為全部程式碼:
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class MyShow
{
String
Filename;
BufferedImage
image;
BufferedImage
tmpIma;
JFrame jf;
public
static void main(String argv[])
{
new
MyShow();
}
public
MyShow()
{
LoadFile();
ChangPix();
SetTable();
}
public
void LoadFile()
{
Filename="1.JPG";
try
{
image=ImageIO.read(new
File(Filename));
}
catch(Exception
e)
{
javax.swing.JOptionPane.showMessageDialog(null, "載入圖檔錯誤: "+Filename);
image=null;
}
}
public
void ChangPix(){
tmpIma=new
BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
for(int
i=0;i<image.getWidth();i++){
for(int
j=0;j<image.getHeight();j++){
Color
color=new Color(image.getRGB(i,j));
int
tmp=(color.getRed()+color.getGreen()+color.getBlue())/3;
Color
tmpcol=new Color(tmp,tmp,tmp);
tmpIma.setRGB(i,j,tmpcol.getRGB());
}
}
}
public
void SetTable()
{
jf
= new JFrame("");
JScrollPane scrollPane = new
JScrollPane(new JLabel(new ImageIcon(tmpIma)));
jf.getContentPane().add(scrollPane);
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setTitle(Filename+"
"+image.getWidth()+" x "+image.getHeight());
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
如果您喜歡我的文章,請在文章最末按5下Like!
我將得到LikeCoin的回饋:)
回饋由LikeCoin基金會出資,您只要註冊/登入帳號(FB、Google帳號都可以註冊,流程超快),按L五次左鍵,可以贊助我的文章且完全不會花到錢!
支持創作,正向交流:)
沒有留言:
張貼留言