ともさんのHP >プロブラミング >自作JavaLibrary >【Java】JPG画像変換クラス
【Java】JPG画像変換クラス
JavaでJpg画像を任意の形状に座標変換するクラスです。
以前作った画像変換クラスtomojavalib.gazou.GazouConvは
単純な拡大縮小と90度ごとの回転でした。
今回のクラスは三角関数を用いた複雑な変換が出来るようにしています。
変換した画像はこちら。
JPG画像の座標変換方法
まずはJpge画像を読み込んで、色と座標を別々の変数に入れます。
下の図では矢印のピクセルの情報を座標xy[i]と色grb[i]に入れます。
xyは単にx、y、の数値だけを格納するクラス、iは通し番号です。
座標は単に該当ピクセルの位置を入れます。
で、このxy[i]を変換します。たとえば30度回転させると、
x 8 → 7.93
y 2 → 5.73
となります。大きな白い画像を画像を用意しておき、
ピクセル位置(7,5)の位置に色rgb[i]を塗ります。
これを全部の画素で行えば回転完了
でも...この方法だと変換後に色の塗られていないピクセルが出てしまう欠点があります。
変換前
変換後
下のソースでは、隣のピクセルも同じ色で塗るようにして回避していますが、
この方法だと解像度が悪くなってしまいます。
あらかじめ大きな画像を用意しておき、最後に縮小してアウトプットすればこの問題は解決します。
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画像変換クラス
ツイート