javagif
⑴ java將gif格式圖片轉為jpg格式
圖片文件格式轉換最核心的問題就是要解決各種圖片格式的編碼和解碼,推薦用jimi包,可從http://java.sun.com/procts/jimi/下載該包及其源碼和demo
需要注意的是:jimi提供了對幾乎所有圖片格式的解碼支持,但是為提供gif和tif/tiff格式的編碼api,gif編碼問題在網上可以找到縣相關的源碼,tiff好像jai:http://java.sun.com/procts/java-media/jai/index.jsp提供了它的編碼,不過我沒有用jai,暫時用jpeg編碼代替了。
察看jimi的源碼,在com.sun.jimi.core中是jimi的核心處理api。
public void toJPG(String source, String dest, int quality) {
if (dest == null || dest.trim().equals(""))
dest = source;
if (!dest.toLowerCase().trim().endsWith("jpg")) {
dest += ".jpg";
System.out.println("Overriding to JPG, output file: " + dest);
}
if (quality < 0 || quality > 100 || (quality + "") == null
|| (quality + "").equals("")) {
System.out.println("quality must between 』0』 and 』100』");
System.out.println("set to DEFAULT value:』75』");
quality = 75;
}
try {
JPGOptions options = new JPGOptions();
options.setQuality(quality);
ImageProcer image = Jimi.getImageProcer(source);
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(image);
// 加入屬性設置,非必要
// /*
writer.setOptions(options);
// */
writer.putImage(dest);
} catch (JimiException je) {
System.err.println("Error: " + je);
}
}
在進行格式轉換時,並不需要關心原圖的格式,只要要轉換的圖片格式在jimi的解碼格式范圍內,就可以完全透明的進行decode過程:
ImageProcer image = Jimi.getImageProcer(source);
實際的解碼只需要以行代碼,就這么簡單。
編碼過程最簡單的也只需要很少的代碼:
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(image);
// 加入屬性設置,非必要
// /*
writer.setOptions(options);
// */
writer.putImage(dest);
以上代碼就完成了圖片編碼到輸出到os生成轉換後文件的全過程。
上面代碼中的 writer.setOptions(options)是用來對輸出文件的屬性進行相關的設置,每種格式的屬性都不一樣,com.sun.jimi.core.options.*中針對每種圖片編碼格式的相關屬性提供了getter和setter方法,可以方便的進行設置:
com.sun.jimi.core.options.*中針對每種圖片編碼格式的相關屬性提供了getter和setter方法,可以方便的進行設置:
JPGOptions options = new JPGOptions();
options.setQuality(quality);
格式轉換就這么簡單。
jimi不支持的encode格式的解決
/**
*
* @param source
* @param dest
* @throws JimiException
*/
public void toGIF(String source, String dest) throws JimiException {
if (dest == null || dest.trim().equals(""))
dest = source;
// 1:轉換為jpg
if (!dest.toLowerCase().trim().endsWith("jpg")) {
dest += ".jpg";
}
toJPG(source, dest, 75);
BufferedImage file_in = null;
File file = new File(dest);
try {
file_in = javax.imageio.ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int end = dest.lastIndexOf(".");
file.deleteOnExit();
// output *.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));
// jpg to gif
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(dest);
e.addFrame(file_in);
e.finish();
}
這里用到了AnimatedGifEncoder 類,是我在網上搜索到的,對gif編碼提供了一個實現,雖然還有待晚善的地方,不過單作格式轉關已經夠用了:)
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(dest);
e.addFrame(file_in);
e.finish();
需要注意的是:AnimatedGifEncoder 不能對所有格式的圖片正確的識別,所以先要將其他格式轉為jpg格式(最簡單的方法是用imageIO)
BufferedImage file_in = null;
File file = new File(dest);
try {
file_in = javax.imageio.ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
這樣直接放入BufferedImage中就ok了
e.addFrame(file_in);
實際的編碼過程在上面這句完成。
int end = dest.lastIndexOf(".");
file.deleteOnExit();
// output *.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));
最後,在完成之前別忘了用上面幾句消滅證據喲:)
當然這種方法其實並不好,最徹底的方法是修改AnimatedGifEncoder,不過做人涅要厚道一點,畢竟是人家寫的代碼嘛,如果有興趣的朋友可以討論一下。
格式轉換解決了,縮放功能也就不算是問題了,以下代碼同時實現了格式轉關和線性縮放:
/**
*
* @param img
* @param dest
* @throws JimiException
*/
public void toTIF(Image img, String dest) throws JimiException {
if (!dest.toLowerCase().trim().endsWith("tif")) {
dest += ".tif";
System.out.println("Overriding to TIF, output file: " + dest);
}
dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg";
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(img);
dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif";
writer.putImage(dest);
}
/**
* 線性改變圖片尺寸(可同時改變圖片格式)
*
* @param source
* 源文件完整路徑
* @param desc
* 目標文件完整路徑
* @param ins
* 放大/縮小比率
* @throws JimiException
* @throws IOException
*/
public void changeDimension(String source, String desc, double ins)
throws JimiException, IOException {
String temp = desc;
File _file = null;
if (desc == null || desc.trim().equals(""))
desc = source;
if (!desc.toLowerCase().trim().endsWith("jpg")) {
temp = desc.trim() + ".jpg";
}
this.toJPG(source, temp, 75);
_file = new File(temp); // 讀入文件
Image src = javax.imageio.ImageIO.read(_file); // 構造Image對象
double wideth = (double) src.getWidth(null); // 得到源圖寬
double height = (double) src.getHeight(null); // 得到源圖長
int iWideth = (int) (wideth * ins);
int iHeight = (int) (height * ins);
BufferedImage tag = new BufferedImage(iWideth, iHeight,
BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 繪制縮小後的圖
if (!temp.trim().equals(desc))
_file.deleteOnExit();
if (desc.toLowerCase().trim().endsWith("gif")) {
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(desc);
e.addFrame(tag);
e.finish();
} else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {
this.toTIF(tag, desc);
} else {
JimiWriter writer = Jimi.createJimiWriter(desc);
writer.setSource(tag);
writer.putImage(desc);
}
}
BufferedImage的構造函數中的參數類型為int,所以以上代碼在改變圖象尺寸時稍有偏差,不過簡單演示一下還是可以的。
jimi的example中可以找到很多單項圖片處理功能的demo,夠詳細了吧?有時間可以研究一下,會有不少收獲的。
⑵ java可以控制gif的播放嗎
是可以的,原理是將gif載入到內存中變為一張張圖片,簡單的可以利用thread.sleep(time)來控制顯示圖片的間隔,也可以用其他方法。
⑶ JAVA如何獲取gif圖片的幀數
用PS CS5/6打開gif圖
(其他版本的PS,不能直接讀出動圖)
然後在「時間軸」處,選擇「創建幀動畫」
按住需要減少的幀,拖動到藍色框內,就可以刪除了
最後把圖片保存下來,就行了
⑷ 如何將java中獲取的到gif圖片,在顯示的時候去除背景紅色
簡單一點,用 java.awt.image.BufferedImage逐點過濾,保存成內存圖片,然後直接輸出
⑸ java如何傳輸動態圖片(GIF圖片)
實現思路:無論是何種類型,都是轉換為流的形式進行的文件傳輸和存儲。
可以通過BufferedReader 流的形式進行流緩存,之後通過readLine方法獲取到緩存的內容。
BufferedReader bre = null;
OutputStreamWriter pw = null;//定義一個流
try {
String file = "D:/test/test.GIF";
bre = new BufferedReader(new FileReader(file));//此時獲取到的bre就是整個文件的緩存流
pw = new OutputStreamWriter(new FileOutputStream(「D:/New.GIF」),"GBK");//確認流的輸出文件和編碼格式,此過程創建了「test.GIF」實例
while ((str = bre.readLine())!= null) // 判斷最後一行不存在,為空結束循環
{
pw.write(str);//將要寫入文件的內容,可以多次write
};
bre.close();
pw.close();//關閉流
備註:文件流用完之後必須及時通過close方法關閉,否則會一直處於打開狀態,直至程序停止,增加系統負擔。
⑹ 怎樣為JAVA為面板添加GIF圖片
很簡單,用一個lable標簽就可以了
JLabel imag=new JLabel(new ImageIcon("images/1.gif"));
imag.setBounds(0, 0, 125, 125);
jpl_3.add(imag);
⑺ 新手發問 怎麼用java做出動圖
package com.test;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class MakeOver {
public static void main(String[] args) {
MakeOver mo = new MakeOver();
mo.CreateGIF("e:/pic/test.gif","e:/map.gif","e:/pic/",82,395);
//參數列表:輸出圖片地址,加水印的圖片地址,動態圖標地址,縱坐標,橫坐標
//注意:此 e:/pic/ 目錄下的文件如下 1.gif 2.gif 3.gif 。。。。
}
public void CreateGIF(String outputFileName,String path1,String path2,int height,int weidth){
try {
// 指定Frame的文件
AnimatedGifEncoder e = new AnimatedGifEncoder();
OutputStream os = new FileOutputStream(outputFileName); //輸出圖片
e.start(os);// 開始處理
e.setQuality(15); //設置圖片質量
e.setRepeat(0); //設置循環
e.setDelay(500); // 設置延遲時間
MakeOver abc = new MakeOver(); //實例化圖片合成類
String path3 = ""; //動態圖片地址
for (int i = 1; i < 3; i++) { //此處只添加 2 張gif圖片
path3 = path2 + i +".gif";
BufferedImage im = abc.pressImage(path3,path1, weidth, height);
e.addFrame(im);// 循環加入Frame
}
e.finish();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
public BufferedImage pressImage(String pressImg,
String targetImg, int x, int y) {
try {
// 目標文件
File _file = new File(targetImg);
Image src = ImageIO.read(_file);
int wideth = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(wideth, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.drawImage(src, 0, 0, wideth, height, null);
// 水印文件
File _filebiao = new File(pressImg);
Image src_biao = ImageIO.read(_filebiao);
int wideth_biao = src_biao.getWidth(null);
int height_biao = src_biao.getHeight(null);
g.drawImage(src_biao, x,
y, wideth_biao, height_biao, null);
// 水印文件結束
g.dispose();
return image;
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
return null;
}
}
⑻ Java支持GIF和JPEG圖像格式嗎
Java1.0支持顯示GIF和JPEG格式的圖像文件,這些文件的擴展名為.gif、.jpg或.jpeg。在java.awt.image包、java.awt包和java.applet包中都有對圖像的支持
⑼ java 怎麼把gif圖按比例縮放
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.geom.*;
importjava.util.*;
finalclasscatextendsJFrame{
=newDimension(800,600);
publicStringgetTitle(){return"cat";}
(){returnSIZE;}
publicDimensiongetMinimumSize(){returnSIZE;}
publicDimensiongetMaximumSize(){returnSIZE;}
publicDimensiongetSize(){returnSIZE;}
privateCanvascanvas;
privateBrushbrush;
cat()throwsHeadlessException{
init();
attachListeners();
doLay();
setVisible(true);
}
privatevoidinit(){
brush=newCatBrush();
canvas=newCanvas(brush);
}
privatevoidattachListeners(){
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(1);
}
});
}
privatevoiddoLay(){
Containercontainer=getContentPane();
container.add(canvas,BorderLayout.CENTER);
pack();
}
publicstaticvoidmain(String...args){
System.setProperty("swing.defaultlaf","com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.invokeLater(cat::new);
}
{
/**
*dopaintaction
*@
*/
voidpaint(Graphicsg);
/**
*Thecomponentthatthisbrushhold
*@returncomponentinstance
*/
ComponentgetOwner();
voidsetOwner(Componentowner);
}
{
privateComponentowner;
privateImageimg;
=AffineTransform.getScaleInstance(.4d,.4d);
publicCatBrush(){
img=Toolkit.getDefaultToolkit().getImage("G:\cat.jpg");
}
publicComponentgetOwner(){
returnowner;
}
publicvoidsetOwner(Componentowner){
this.owner=owner;
}
publicvoidpaint(Graphicsg){
Graphics2Dg2=(Graphics2D)g.create();
g2.drawImage(img,affineTransform,getOwner());
g2.dispose();
}
publicvoipdate(Observableo,Objectarg){
if(owner!=null)owner.repaint();
}
}
/**
*youcanvas
*/
{
privateBrushbrush;
privateCanvas(Brushbrush){
super();
this.brush=brush;
brush.setOwner(this);
}
protectedvoidpaintComponent(Graphicsg){
super.paintComponent(g);
if(brush==null)return;
brush.paint(g);
}
}
}