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
高画質で画像縮小
高画質で画像を縮小するために、PHPやjavascriptなどでいろいろ作ってみました。
以前javaでも作ってみたがどうにも画質が良くありません。
javaにもいくつかの方法があるようで今回はサイトで見た別の方法を試してみました。
これが今までで一番画質が良かったのでメモっておくことにしました。
主なフィールド
画像は長辺と短辺があるので長い方を基準に縮小するようにしています。
public class ResizeImage extends javax.swing.JFrame {
private int longerSize; //画像の長辺がこのピクセルになるように拡縮する
private int resizedW;
private int resizedH;
画像縮小のメイン部
実際のアプリでは複数の画像ファイルを縮小できるように、このメイン部をループさせています。
try{
BufferedImage originalImage = ImageIO.read(new File(元ファイルパス));
// 新規画像のサイズ計算
longerSize = 600; // 長辺のサイズを600pxに縮小
sizeCalculate(originalImage, longerSize);
// 画像サイズ変更
BufferedImage scaleImg = scaleImage(originalImage, resizedW, resizedH);
// 縮小後の画像を画質を指定してファイルに出力
// 文{}の終わりでリソース(imageStream)が確実に閉じられるよう try-with-resources文を使う
try (ImageOutputStream imageStream =
ImageIO.createImageOutputStream(new File(縮小ファイルパス)
)) {
// imageStreamの画質に利用される(paramをIIOImageに渡す)
JPEGImageWriteParam param = new JPEGImageWriteParam(Locale.getDefault());
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1f); // 画質 0f(低) ~ 1f(高)
// ファイルに出力
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
writer.setOutput(imageStream);
writer.write(null, new IIOImage(scaleImg, null, null), param);
imageStream.flush();
writer.dispose();
}
}catch(Exception e){
this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR ));
System.out.println(e);
}
縮小後のサイズを計算するメソッド
長辺を基準として縮小後のサイズを計算します。
上記メイン部の9行目で使用しています。
//縮小後のサイズを計算
private void sizeCalculate(BufferedImage bimg, int longerSize) {
double percentage;
//長辺を基準として縦横percentageの縮小倍率を求める
if(bimg.getWidth() >= bimg.getHeight()){
percentage = ((double)longerSize / bimg.getWidth());
// 長辺
resizedW = longerSize;
// 短辺
resizedH = (int)(bimg.getHeight() * percentage);
}else{
percentage = ((double)longerSize / bimg.getHeight());
// 短辺
resizedW = (int)(bimg.getWidth() * percentage);
// 長辺
resizedH = longerSize;
}}
サイズを変更するメソッド
長辺を基準として縮小後のサイズを計算します。
上記の23行目でIIOImageの引数になっています。
// サイズの変更
private BufferedImage scaleImage(Image img, int dw, int dh) {
// image のサイズを(dw, dh)に変更する
BufferedImage resizeImage =
new BufferedImage(dw, dh, BufferedImage.TYPE_3BYTE_BGR);
resizeImage.createGraphics().drawImage(
img.getScaledInstance(dw, dh, Image.SCALE_AREA_AVERAGING),
0, 0, dw, dh, null);
return resizeImage;
}
画質が良い分ファイルサイズは大きめでした。