にもじ

JavaとかRubyのめも

Eclipce memo

キー 説明
Ctrl + / 選択している行をコメントアウト
Ctrl + Shift + r ファイルを探す
Ctrl + Alt + h 呼び出し元を探す
Ctrl + h ファイルを横断した文字列検索
Ctrl + e 開いているタブの検索
Ctrl + F11 プログラムの実行
  • 参考

qiita.com

Java フォルダ内の画像をリサイズするプログラム

経緯

離れた家族に写真を見せるため、昔から自分の家族用にブログをやってます。

最近はLINEで写真送ったりしますが、旅行などの写真は今でもブログにUPしています。

前からお世話になっているそのブログサービス、画像の投稿サイズが制限されます。
私はWindowsのペイントを使って一つずつサイズを小さくしていました。

手作業はきつい

その作業、プログラム化したいとずっと思ってて、でもたまにの事なので後回しにしていたのですが、作ってみました。

以下のサイト他いろいろと参考にしながら作成。

teratail.com

コード

いろいろと汚いのはご容赦ください。手続き型言語っぽいですね。

171217少し変えてみた

  • これがプライマリのクラスです。
import tools.GetCurrentJpegFile;
import tools.ResizeImage;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
import java.io.IOException;

public class Resizer {

  public static void main(String[] args) {
    // Resize the image file in the current directory.
    List<File> list = new ArrayList<>();
    GetCurrentJpegFile f = new GetCurrentJpegFile();
    list = f.execute();

    ResizeImage r = new ResizeImage();

        for (File file:list){
      try {
        r.execute(file);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    }

}
  • 少しクラスをわけてみた
package tools;

import java.io.FilenameFilter;
import java.util.List;
import java.util.ArrayList;
import java.io.File;

public class GetCurrentJpegFile {
  public List<File> execute(){

    // create ipeg File
    FilenameFilter filter = new FilenameFilter(){
      public boolean accept(File file, String name){
        if (name.indexOf(".jpeg") != -1 || name.indexOf(".JPG") != -1 ||
            name.indexOf(".jpg") != -1 ){
              return true;
            } else {
              return false;
            }
      }
    };

    File dir = new File(System.getProperty("user.dir"));
    File[] files = dir.listFiles(filter);
    List<File> list = new ArrayList<>();

    for (File file:files){
      list.add(file);
    }
    return list;
  }
}
package tools;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ResizeImage {

  public void execute(File fromFile) throws IOException {

    BufferedImage imageBefore = null;
    try {
      imageBefore = ImageIO.read(new File(fromFile.toString()));
    }catch (Exception e){
      e.printStackTrace();
    }

    byte[] beforeData = getBytesFromImage(imageBefore, "jpg");

    double lw = 1024.0;
    double lh = 768.0;
    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(beforeData));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    double w = 0;
    double h = 0;
    if (bufferedImage.getWidth() > bufferedImage.getHeight()) {
      h = lh;
      w = bufferedImage.getWidth() * (lh / bufferedImage.getHeight());
      if (lw > w) {
        h = h * (lw / w);
        w = lw;
      }
    } else {
      w = lw;
      h = bufferedImage.getHeight() * (lw / bufferedImage.getWidth());
      if (lh > h) {
        w = w * (lh / h);
        h = lh;
      }
    }
    ImageIO.write(resize(bufferedImage, (int) lw, (int) lh, (int) w, (int) h), "jpg", baos);
    baos.flush();
    byte[] afterData = baos.toByteArray();

    BufferedImage imageAfter = null;
    imageAfter = getImageFromBytes(afterData);
    String str = fromFile.toString();

    String reg = ".jpg|.JPG|.jpeg";

    Pattern pattern = Pattern.compile(reg);
    Matcher matcher = pattern.matcher(str);
    String strAfter = matcher.replaceAll("aft.jpg");

    ImageIO.write(imageAfter, "jpeg", new File(strAfter));
    baos.close();
  }
  private static BufferedImage resize(BufferedImage bufferedImage, int layoutWidth, int layoutHeight, int imageWidth,
      int imageHeight) {
    BufferedImage scaledBI = new BufferedImage(layoutWidth, layoutHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = scaledBI.createGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, layoutWidth, layoutHeight);
    int x = (layoutWidth - imageWidth) / 2;
    int y = (layoutHeight - imageHeight) / 2;
    g.drawImage(bufferedImage, x, y, imageWidth, imageHeight, null);
    g.dispose();
    return scaledBI;
  }

  //
  public static byte[] getBytesFromImage(BufferedImage img, String format) throws IOException{
    if (format == null ) {
      format = "png";
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(img, format, baos);
    return baos.toByteArray();
  }

  //
  public static BufferedImage getImageFromBytes(byte[] bytes) throws IOException{
    ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
    BufferedImage img = ImageIO.read(baos);
    return img;
  }
  }

結果

f:id:emkiki:20171216084311p:plain

こんな感じにサイズ縮小が出来ています。写真2つくらいですと大して嬉しくないかもですが、何十枚も投稿する際はかなり楽になります。

Java 道のりが長いことが分かった

Javaについての私の状況

  • 数年前にサーティファイJava2級取得
  • 2017年11月からJava再開(それまではRubyをやっていた)
  • スッキリわかるJava入門と実践編をざっと読みなおす
  • Javaの入門書を何冊も買う
  • スッキリわかるサーブレットJSP入門 を写経しながら取り組んで、独自にアプリつくる

初心者で実務経験ないけど、文法は一通りやったしアプリも作ってちょっと自信がついていた状況。

ですが

Seasar2徹底入門 SAStruts/S2JDBC対応」、やってみたら、全然わからない。

知らない言葉がたくさん。

そしてサンプル書いても動かない(これはJava9だったのがダメだった模様)。

これは先が長いなと思った次第です。
転職まで1か月を切った今、限られた時間でどこまで進められるかな(働きながらでほぼ時間がない)。

共感できるスライドを見つけた

Seasar2のスライドを探していたら、共感できるスライドを発見。
こちらの方でも数か月、真剣に取り組んで出来たこと。

www.slideshare.net

printlnって何だったの

この一言に共感。

ちょっと早かったかな。Seasar2はざ~っと流して、今は他の本で勉強中です。