ともさんのHP >プロブラミング >自作JavaLibrary >【Java】JPG画像変換クラス

【Java】JPG画像変換クラス

JavaでJpg画像を任意の形状に座標変換するクラスです。
以前作った画像変換クラスtomojavalib.gazou.GazouConvは 単純な拡大縮小と90度ごとの回転でした。

広告

今回のクラスは三角関数を用いた複雑な変換が出来るようにしています。
変換した画像はこちら

JPG画像の座標変換方法

まずはJpge画像を読み込んで、色と座標を別々の変数に入れます。
下の図では矢印のピクセルの情報を座標xy[i]と色grb[i]に入れます。
xyは単にx、y、の数値だけを格納するクラス、iは通し番号です。 座標は単に該当ピクセルの位置を入れます。
java座標変換


で、このxy[i]を変換します。たとえば30度回転させると、
x 8 → 7.93
y 2 → 5.73
となります。大きな白い画像を画像を用意しておき、 ピクセル位置(7,5)の位置に色rgb[i]を塗ります。
これを全部の画素で行えば回転完了
java座標変換後


でも...この方法だと変換後に色の塗られていないピクセルが出てしまう欠点があります。
java座標変換前変換前

java座標変換後変換後


下のソースでは、隣のピクセルも同じ色で塗るようにして回避していますが、 この方法だと解像度が悪くなってしまいます。
あらかじめ大きな画像を用意しておき、最後に縮小してアウトプットすればこの問題は解決します。


JAVAクラスのソース



package tomojavalib.gazou;

import java.awt.Image;

import tomojavalib.gazou.*;

/**
 * 画像を読み込んで回転などの変換を行うクラス
 * このクラスでは複雑な移動を扱う
 * @author tomo
 * 最初に書き込み用の大きなimgを用意しておき、そこへ
 * 座標変換した画像を貼り付け、保存する。
 *
 */
public class GazouConv2 {
 
public XY xy[] = null;
public int rgb[] = null;  
public java.awt.image.BufferedImage cambas = null;
private ZahyouHenkan z = new ZahyouHenkan();

 /**
  * 動作試験
  * @param args
  */
 public static void main(String[] args) 
 {
   GazouConv2 gc = new GazouConv2();
   gc.getJpg("test1.jpg");
   gc.setHaikei(1500, 1000);
   //;
   //gc.setGazou();    
   
   //gc.kaiten(-10.);
   //gc.sinsyuku( 1. , 0.5 );
   //gc.setGazou();
   //gc.setGazou();
   gc.sinsyuku( 1. , 0.5 );
   
   gc.ougi( -350. );
   //gc.heikou( 0. , -10. );
   gc.setGazou();
   /*
   gc.kaiten(75.);gc.setGazou();
   gc.kaiten(75.);gc.setGazou();
   gc.kaiten(75.);gc.setGazou();
   gc.kaiten(75.);gc.setGazou();
*/
   gc.saveJpg( "test2.jpg" );
 }
 
 

 
/**
 * 背景に画像を貼り付ける
 */
public void setGazou()
{
 if(rgb==null){return;}
 if(cambas ==null){return;}
 for(int i=0 ; i< rgb.length;i++ )
 {
   int x = (int)(xy[i].x + cambas.getWidth()/2. +.01);
   int y = (int)(xy[i].y + cambas.getHeight()/2.) ;
   if(x>-1){if(x<cambas.getWidth()){
   if(y>-1){if(y<cambas.getHeight()){  
   cambas.setRGB( x , y , rgb[i] );
   }}}}
   if(x>-1){if(x<cambas.getWidth()){
   if(y>-1){if(y<cambas.getHeight()){      
   x=(int)(xy[i].x + cambas.getWidth()/2. -.5);
   cambas.setRGB( x , y , rgb[i] );
   }}}}
 }
}

/**
 * 画像をx,y倍に伸縮する
 * @param x
 * @param y
 */

public void sinsyuku(double x, double y)
{
 if(xy==null){return;}
 if(cambas ==null){return;}
 for(int i=0 ; i< xy.length;i++ )
 {  
 xy[i] = z.sinsyuku(xy[i], x, y);
 }  
}


public void ougi( double r )
{
 if(xy==null){return;}
 if(cambas ==null){return;}
 for(int i=0 ; i< xy.length;i++ )
 {  
 xy[i] = z.ougi( xy[i] , r);
 }  
}


/**
 * 平行移動
 * @param x
 * @param y
 */
public void heikou(double x,double y)
{
 if(xy==null){return;}
 if(cambas ==null){return;}
 for(int i=0 ; i< xy.length;i++ )
 {  
 xy[i] = z.heikou(xy[i], x, y);
 }  
}

/**
 * 画像回転
 * @param kakudo回転角度
 */
public void kaiten( double kakudo )
{
 if(xy==null){return;}
 if(cambas ==null){return;}
 for(int i=0 ; i< xy.length;i++ )
 {  
 xy[i] = z.kaiten(xy[i], kakudo );
 }
}

/**
 * 背景になるimgを作成する
 * @param x imgの幅
 * @param y imgの高さ
 */
public void setHaikei(int x,int y)
{
 cambas = new java.awt.image.BufferedImage( x , y , Image.SCALE_SMOOTH );
  java.awt.Graphics g = cambas.getGraphics();
  g.setColor( java.awt.Color.WHITE );
  g.fillRect(0,0,x,y);
}
 


 
 
/**
 * イメージを画像ファイルに出力する
 */
public void saveJpg( String savefilename )
{
 if(cambas ==null){return;}  
 try {
   java.io.File f = new java.io.File( savefilename );
    javax.imageio.ImageIO.write( cambas , "jpg", f );
   }catch (Exception e) { e.printStackTrace(); }
   return;
}




広告

/**
 * 画像ファイルを読み込んでXYとrgbにデータを入れる
 */
public void getJpg( String filename )
{
 java.io.File f = null;
 java.awt.image.BufferedImage img = null;
 /*ファイル読み込み*/
 try {
  f = new java.io.File( filename );
  img = javax.imageio.ImageIO.read( f );
 }catch (Exception e) { e.printStackTrace(); }

 //読み込んだファイルを位置、色情報に分けて入れる
 if(img ==null){}else{
 int pixlength = img.getWidth() * img.getHeight();
 xy= new XY[ pixlength ];
 rgb = new int[ pixlength ];
 int iii=0;
 for(int i=0 ;i < img.getWidth(); i++ )
 {for(int ii=0 ;ii < img.getHeight(); ii++ ){
     //System.out.println( i+" "+ii+" " + pixlength+" "+iii );
     xy[iii] = new XY();
     xy[iii].setXY((double)i,(double)ii);
     rgb[iii] = img.getRGB(i, ii);
     //System.out.println(xy[iii].x+" "+xy[iii].y+" "+rgb[iii] );
     iii++;
 }}
 }
return;
}
}

最終更新日: 2017-09-15 15:30:47

ともさんのHP >プロブラミング >自作JavaLibrary >【Java】JPG画像変換クラス

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

ツバキの栽培、手入れ、増やしかた  
柿の剪定道具  
新旧文化式とドレメ式原型製図を比較  
玉縁ボタンホールの縫い方  
キャスケット型紙の設計方法と型紙ダウンロード  
重箱式巣箱の図面  
ブルーベリーの挿し木  
ホオノキ  
アリジゴクの飼いかた  
シンプルなパネルラインワンピースの型紙と作りかた  
ベジェ曲線の原理  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます