如何在圖上再放置另一張圖?

這個可以做什麼運用呢?沒錯,可以拿來做浮水印。

方法很簡單,先開啟一張圖當基底,取得此基底的長寬建立一個BufferedImage,再拿這個BufferImage的畫筆Graphics,把基底圖畫上去,再來取得要放置在這張基底圖上的圖,依照設定坐標,畫在BufferedImage上,再來只要輸出就可以了。

首先先找二張圖,如果找不到的話可以下載下面二張圖

1.jpg 是高雄的旗津,這張當基底圖

1.jpg
Read More

二張圖合成一張圖左右二邊

這是一個十分簡單的程式,主要的功用在於把二張size一樣的圖,合成在一張圖的左右二邊,程式寫的蠻死的,一定要size一樣,有興趣的人可以自己改成動態的二張圖。

首先我們先找了二張圖,就下面二張,如果突然找不到圖的朋友們,可以直接下載下面二張來使用。

圖一,1.jpg

1.jpg
Read More

(教學)在Ubuntu裡建立Apache with Tomcat 服務-2

前一篇資料(教學)在Ubuntu裡建立Apache with Tomcat 服務-1

再來要介紹JMagick及ImageMagick的安裝 in Ubuntu 9.10(Linux)

包含jpeg及png支援

1.安裝zlib ->jpeg需使用

#cd /opt/ 
#sudo wget http://www.zlib.net/zlib-1.2.3.tar.gz 
#sudo tar zxvf zlib-1.2.3.tar.gz 
#cd /opt/zlib-1.2.3 
#sudo ./configure 
#sudo make 
#sudo make install

2.安裝jpeg lib 使其支援jpeg jpg格式

#sudo mkdir /usr/local/modules 
#sudo mkdir /usr/local/modules/jpeg6 
#sudo mkdir /usr/local/modules/jpeg6/bin 
#sudo mkdir /usr/local/modules/jpeg6/lib 
#sudo mkdir /usr/local/modules/jpeg6/include 
#sudo mkdir /usr/local/modules/jpeg6/man 
#sudo mkdir /usr/local/modules/jpeg6/man/man1 
#cd /opt/ 
#sudo wget http://ftp.ntu.edu.tw/gnu/pub/gnu/ghostscript/jpegsrc.v6b.tar.gz 
#sudo tar zxvf jpegsrc.v6b.tar.gz 
#cd /opt/jpeg-6b 
#sudo ./configure --prefix=/usr/local/modules/jpeg6 --enable-shared --enable-static 
#sudo make 
#sudo make install

3.安裝png lib 使其支援png格式

Read More

Java利用Imagick來ReSize圖片檔-使用JMagick

程式很簡單 ,只需要在利用command在程式目錄下執行

java -jar ReSizeImage.jar

就可以啦!

預設是縮成以寬為500px基準,如果要改變寬可以利用

java -jar ReSizeImage.jar 數字

縮完的圖會放到程式目錄的resize目錄裡

我Blog都是以500寬為基準,我想應該夠用了吧^^

程式目錄結構

  • ReSizeImage.jar
  • jmagick.dll
  • lib/Jmagick.jar

記得要先下載Imagick來安裝才能使用喔

按裝方法如下:

JMagick-Java open source free影像壓縮

範例圖檔可以按圖下載,放置於程式目錄

DSCN3599.JPG

原始碼下載

class Tool整個壓縮以外的實作均在此

package image;

import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class Tool {

    public Tool(int width) {

        // 取得class路徑所有檔案
        File f = new File(".");
        File[] list = f.listFiles();
        for (int i = 0; i < list.length; i++) {
            // 是否為圖檔,是的話進行縮圖
            if (isImg(getFileType(list[i].getName()))) {
                System.out.println("處理檔案名稱:" + list[i].getName());
                toCompressImg(list[i].getAbsolutePath(), getRealDir(list[i]
                        .getAbsolutePath())
                        + "resize" + File.separator + list[i].getName(), width);
            }
        }

    }

    // 取得副檔名
    private String getFileType(String str) {
        int startIndex = str.lastIndexOf(46) + 1;
        int endIndex = str.length();
        return str.substring(startIndex, endIndex); // 副檔名

    }

    // 傳入副檔名 檢查是否為指定圖檔jpg gif png
    private boolean isImg(String str) {
        return (("jpg,gif,png").indexOf(str.toLowerCase())) > -1;
    }

    // 找目錄
    private String getRealDir(String str) {
        int endIndex = str.lastIndexOf(File.separator) + 1;
        int startIndex = 0;
        return str.substring(startIndex, endIndex); // 副檔名
    }

    public void toCompressImg(String iFile, String oFile, int newWidth) {
        try {
            File fi = new File(iFile); // 大圖文件
            if (!fi.exists())
                return;
            String oPath = oFile
                    .substring(0, oFile.lastIndexOf(File.separator));
            File foPath = new File(oPath);
            if (!foPath.exists())
                if (foPath.mkdir())
                    System.out.println("ooo toCompressImg() File out path:"
                            + oPath + " mkdir成功!");
            File fo = new File(oFile); // 將要轉換出的小圖文件

            int nw = newWidth;
            // AffineTransform transform = new AffineTransform();
            BufferedImage bis = ImageIO.read(fi);
            int w = 0, h = 0;
            try {
                w = bis.getWidth();
                h = bis.getHeight();
            } catch (Exception e) {
                fileCopy(fi, fo);
                return;
            }
            if (nw > (w < h ? h : w)) {
                fileCopy(fi, fo);
                return;
            } // 壓縮寬度比原始檔大,那就不壓縮了;

            int nh = (nw * h) / w;
            // double sx = (double) nw / w;
            // double sy = (double) nh / h;

            JMagickScale.Compress(fi.getAbsolutePath(), fo.getAbsolutePath(),
                    nw, nh);
            /*
             * transform.setToScale(sx, sy); //System.out.println(w + ", " + h);
             * AffineTransformOp ato = new AffineTransformOp(transform, null);
             * BufferedImage bid = new BufferedImage(nw, nh,
             * BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid);
             * ImageIO.write(bid, "jpeg", fo);
             */
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void fileCopy(File inputFile, File outputFile) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(inputFile);
            fos = new FileOutputStream(outputFile);
            int c;
            while ((c = fis.read()) != -1)
                fos.write(c);

            fis.close();
            fos.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        int width = 500;

        try {
            width = Integer.parseInt(args[0]);
        } catch (Exception e) {

        }
        if (width <= 0) {
            System.out.println("Width Error");
        } else {
            new Tool(width);
        }

    }
}

class JmagickScale壓縮的實作

package image;

import magick.ImageInfo;
import magick.MagickException;
import magick.MagickImage;

public class JMagickScale {
    public static void Compress(String source, String To, int width, int height)
            throws MagickException {
        if (System.getProperty("jmagick.systemclassloader") == null) {
            System.setProperty("jmagick.systemclassloader", "no");
        }
        ImageInfo info = new ImageInfo(source);
        MagickImage image = new MagickImage(info);

        // resize image

        MagickImage scaleImg = image.scaleImage(width, height);

        // write image to file
        scaleImg.setFileName(To);
        scaleImg.writeImage(info);

    }
}

成功的圖,可以按進去flickr看壓好的圖效果

resizeDSCN3599.JPG

在現有圖片中加亂數碼(文字)

構想:

在現有的圖片裡,列如樣版票圖,再加入亂數碼,以區別每個票圖的唯一性。

想法:

取得亂數碼,打開樣版票圖,取得畫筆(Graphics2D),把亂數碼設定到TextLayout圖層上,

計算放置TextLayout圖層的x及y坐標,把圖層draw到樣版圖上,輸出到以亂數碼為名稱之圖檔。

以下是範例程式:

程式大樣分成二大部份,一是圖形的加註文字,二是取得亂數編號的方式。

Read More