ともさんの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画像変換クラス

広告
新着ページ

AIを利用し、衣服のデザイン画から型紙を制作する方法  
2つのアパレル3D技術でひらくオーダーメイド生産の手法  
【洋裁型紙】前後身頃の肩の傾きは何故前身頃の方が傾いているのか  
電子追尾式天体写真撮影法  
日本ミツバチ巣箱の種類  
ドラフター(製図台)でソーイング  
日本ミツバチが逃亡  
カメさんの箱庭  
天体用デジタルカメラの構造と天体写真  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
USBカメラをJAVAで制御  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

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