PROGRAMMING
Java
- IntelliJ.Gradle.JavaFX(6) プラグイン org.beryx.jlink を使ってみる
- IntelliJ.Gradle.JavaFX(5) NSISでインストーラーを作る
- IntelliJ.Gradle.JavaFX(4) exewrapで実行可能jarをexe化する
- IntelliJ.Gradle.JavaFX(3) Jlink でカスタム JRE を作る
- IntelliJ.Gradle.JavaFX(2) すべての依存対象を含んだ Fatjar を作る
- IntelliJ.Gradle.JavaFX(1) アプリケーションを作る
- javaのコンパイルと実行
- イメージを回転する
- Exif情報を簡単に取得できるライブラリ
- 高画質で画像縮小
- JDBCによるデータベース操作
javascript
- ページャーを作る(簡易版)
- ページャーを作る 4/4
(クロスブラウザ対策)
(ページャー表示用メソッド)
(ページャーの使い方) - ページャーを作る 3/4
(イベント登録) - ページャーを作る 2/4
(スタイルの設定) - ページャーを作る 1/4
(ページャー用関数を準備)
(各要素を生成) - 自作カレンダーを作る 6/6
(11.~14.各種メソッド)
(15.簡単な使い方) - 自作カレンダーを作る 5/6
(09.祝休日の判定)
(10.閏年の判定) - 自作カレンダーを作る 4/6
(08.イベントの設定) - 自作カレンダーを作る 3/6
(07.スタイルの設定) - 自作カレンダーを作る 2/6
(05.カレンダーのマスのみ作成)
(06.各マスへ年月・日付を埋め込み) - 自作カレンダーを作る 1/6
(01.カレンダーの基を準備)
(02.各月の日数や年月日の区切り文字)
(03.前月・次月指定時の処理)
(04.前月・次月部分の年月を算出) - JS-Image-Resizerを使って画像を高画質で縮小
- ファイルを作成しローカルに保存
- モーダルウィンドウをクラス化
- ストップウォッチを作る
- XMLHttpRequest Lebel2を試してみる
- jQuery:Tableで親・子・兄弟要素を取得
- 文字列をセパレータ文字で分割し配列で返す関数
- forループのカウンタを使用している関数の定義
- クロージャの使いどころ
- JSONPでクロスドメイン
- AjaxでJSON形式のデータを扱う
- jsファイルからjsファイルを呼び出す
- jQuery:モーダルウィンドウを作ってみる
CSS
- フォルダ構成をCSSで見やすくする
- シンタックスハイライトPrismのカスタマイズ
- リスト(li)を中央に配置する
- ブロックレベル要素全体をリンクにする
- 実践と点線の交わり部分のギザギザをすっきりさせる
PHP
イメージを回転する
Exifの関係で、孫の写真をサーバに送った後にその写真が回転していることに気づくということが多々ありました。
そのたびに画像処理ソフトで元に戻してからあらためてサーバーに送るということをしていました。
重い画像処理ソフトをいちいち立ち上げるのも面倒なので、回転ツールを作ることにしあちらこちら調べながらようやく出来上がりました。
現在は、ExifのOrientationタグを見て自動で回転するようにして使っています。
イメージ回転の全コード
いざ、作ろうと調べたらjavaで画像を回転する方法はさまざまあるようです。
その中でも、回転の軸を画像の中心にする方法がネットでは多かったようです。
ただ、自分的には原点を軸に回転する方法がしっくりというか簡単に考えられたのでその方法で作ることにしました。
次がその全コードです。
public class ImgRotate {
/*
inputPath 元画像パス
outputPath 出力画像パス
angle 回転角度
*/
public ImgRotate(String inputPath, String outputPath, int angle){
int width;
int height;
BufferedImage sourceImage;
BufferedImage outputImage;
try {
File inputFile = new File(inputPath);
// 元画像ファイル読み込み(戻り値はBufferdImageオブジェクト)
sourceImage = ImageIO.read(inputFile);
width = sourceImage.getWidth();
height = sourceImage.getHeight();
// 回転後のイメージ描画領域確保
switch (angle) {
case 90:
case 270:
// 回転のため縦横のサイズを逆にして確保
outputImage =
new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
break;
case 180:
outputImage =
new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
break;
default:
outputImage = null;
}
// outputImage(BufferedImage)に描画するためのGraphics2Dを作成
Graphics2D g2 = outputImage.createGraphics();
// 回転変換用
AffineTransform afRotate = new AffineTransform();
// 平行移動用
AffineTransform afTrans = new AffineTransform();
// 原点を中心にangle度回転
afRotate.rotate(Math.toRadians(angle), 0.0, 0.0);
// BufferdImageと画像が合うように移動
switch (angle) {
case 90:
afTrans.translate(height, 0.0);
break;
case 180:
afTrans.translate(width, height);
break;
case 270:
afTrans.translate(0.0, width);
break;
}
// 回転と移動を連結させる(回転後に移動となる)
// 数式だと移動の行列と回転の行列をかけあわせることになるが、
// AffineTransformではconcatenateメソッドで連結することで一連の変化になる。
// 必ず後の変換(移動:afTrans)に、前の変換(回転:afRotate)を付け足す。
afTrans.concatenate(afRotate);
// g2(Graphics2D)で、sourceImageに変換(afTrans)を適用して
// outputImage(BufferedImage)に描画
g2.drawImage(sourceImage, afTrans, null);
// ファイルに書き出し
boolean bool = ImageIO.write(outputImage, "jpg", new File(outputPath));
} catch (IOException e) {
System.out.println(e);
}
}
}
AffineTransformのconcatenateメソッドで変換を連結することができると知りました。
オラクルのページ
では「concatenate(AffineTransform Tx):
Txによって元のユーザー空間にマップされた新しいユーザー空間を提供するためにもっとも一般的に使用される方法で、
AffineTransform TxをこのAffineTransform Cxに連結します。」と解説されていましたが全く意味が分かりませんでした。