- PR -

pngファイルの書き出し方法について

1
投稿者投稿内容
しん
会議室デビュー日: 2006/09/27
投稿数: 5
投稿日時: 2006-09-27 13:43
pngファイルを読み取りピクセル操作をしそのイメージをpngファイルとして出力するプログラムをJAVAで作成したいのですが現在以下のようにピクセル操作をし,イメージを表示する部分までは用意ができたのですがpngファイルに書き出す方法についてアドバイスをいただけないでしょうか?


     〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


import java.applet.*;
import java.awt.*;
import java.awt.image.*;


public class IMG extends Applet
{

Image img; //読み込んだピクセルデータを格納する
Image new_img; //ピクセル操作後のピクセルデータを格納する

int w = 0; //ピクセルの横幅
int h = 0; //ピクセルの縦幅

int pix[]; //操作前のピクセル数値
int new_pix[]; //操作後のピクセル数値

public void init()
{

img = getImage(getCodeBase(),"test.png");//画像ファイルの読み込み


//以下画像ファイルの読み込みまで待機の命令
MediaTracker mt = new MediaTracker(this);
mt.addImage(img,0);
try
{
mt.waitForID(0);
}

catch (InterruptedException e){}
//ファイル読み込み終了

w = img.getWidth(this); //イメージの横幅を取得
h = img.getHeight(this); //イメージの縦幅を取得

pix = new int [w*h]; //配列の要素数の設定
new_pix = new int [w*h]; //配列の要素数の設定

setpix();
}

void setpix()
{
try
{
PixelGrabber pg = new PixelGrabber //オブジェクトの生成
(img,0,0,w,h,pix,0,w); //イメージオブジェクト,抽出を開始するx座標,
//抽出を開始するy座標,抽出する横幅,抽出する縦幅
//抽出したピクセル値の配列,オフセット値,横幅のスキャンサイズ


pg.grabPixels(); //ピクセル抽出
}
catch(InterruptedException e){}

for(int i=1;i <= w*h;i++)
{
new_pix[i-1] = pix[w*h-i]; //ピクセル操作
}

MemoryImageSource mimg = new MemoryImageSource //オブジェクトの生成
(w,h,new_pix,0,w); //生成するイメージの横幅,縦幅,ピクセル値を収めた配列
//オフセット値,横幅のサイズ

new_img = createImage(mimg); //イメージの生成
}

public void paint (Graphics g)
{

g.drawImage(img,0,0,this); //ピクセル操作前のイメージの表示
g.drawImage(new_img,w+5,0,this); //ピクセル操作後のイメージの表示

}

}
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-27 13:52
pngの読み込みができるなら書き出しもできるだろう、
と思ったのですが、なるほどAppletなのですね…。

画像の読み書きにはjavax.imageio.ImageIOクラスを用います。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/imageio/ImageIO.html

read()とwrite()で簡単に読み書きできます。
ただし、Appletの場合、セキュリティのサンドボックスの関係で
ファイルへの出力は通常の状態だと制限されていますから気をつけましょう。
しん
会議室デビュー日: 2006/09/27
投稿数: 5
投稿日時: 2006-09-27 15:29
nagise>
アドバイスありがとうございます.

この場合読み込みも

ImageIO.read(new File("test.png"));

のようにImageIOを使って最初から書き直したほうがいいのでしょうか?

先ほど書き出しのみをImageIOを用いてプログラムを組んでみたところ
現状ですとMemoryImageSourceでイメージを作成しているのでインターフェースが ImageProducerになっていてImageIOを使うときはイメージのインターフェースをRenderedImageにしなければならないのですよね?先ほどコンパイルしてみたのですが互換性がないというエラーがでてしまったので...調べましたらインターフェースが違うという事に気付いて今調べてみています^^;

MemoryImageSourceで作成したオブジェクトを利用してBufferedImageを利用することはできるのでしょうか?

このプログラムを利用をHP上で実装することを考えているのでできればアプレットを使用したくて^^;



[ メッセージ編集済み 編集者: しん 編集日時 2006-09-27 15:49 ]

[ メッセージ編集済み 編集者: しん 編集日時 2006-09-27 15:51 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-27 15:47
引用:

しんさんの書き込み (2006-09-27 15:29) より:
この場合読み込みも

ImageIO.read(new File("test.png"));

のようにImageIOを使って最初から書き直したほうがいいのでしょうか?



う〜む。もし、そのプログラムが本当にAppletである必要があるなら
いろいろと検討しないといけませんかねぇ。
どういう形で利用しようとしているのか、そのあたりが見えないので
なんとも言えないところなのですが。

Appletである必然性がないのであれば、単純にコンソールで起動する
JavaプログラムにしたうえでInもOutもImageIOを用いれば
よいのではないでしょうか。

Appletである必然性、つまり、ホームページ上にAppletを配置して
ブラウザ上で起動させるという必要性がある場合は…
別途相談してみてください^^;
しん
会議室デビュー日: 2006/09/27
投稿数: 5
投稿日時: 2006-09-27 15:54
なるほど...そうですか...

できればホームページ上などで利用できるものを作成しようと思っていたのですが
アプレットで実行する方法を探しながらコンソールで起動するJAVAプログラムも作成してみることにします^^;
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-27 16:22
引用:

しんさんの書き込み (2006-09-27 15:54) より:
できればホームページ上などで利用できるものを作成しようと思っていたのですが
アプレットで実行する方法を探しながらコンソールで起動するJAVAプログラムも作成してみることにします^^;



その場合はまずサンドボックスとの戦いになりますね。
Appletはセキュリティ上制限が厳しいのでローカルファイルへの
アクセスなどは通常ではできません。

証明書をくっつけてユーザに個別に実行を許可してもらうのが正攻法だったはず。
ただ、証明書ってまじめに取得して利用しようとすると個人のレベルでは
かなりキツイのでちょっと現実的ではないですね。
個人的に利用するならオレオレ証明書で運用する手もありますが。
利用者に対してセキュリティレベルを落として使ってくれ、
という手もないではないですが、避けてください。

JavaWebStartでもAppletと同様のサンドボックスで動くはずですが
標準機能でユーザが選択したファイルへのアクセス権をもらうことが
できたはずなので、まだなんとかなるかもしれません。

あと、AppletでのgetImage()は通常はサーバ側にある画像を
読み込むためのもののはずです。
そういう意味では用途が違うのではないかなぁとも思います。
コンソール版を作ってみてからAppletやJavaWebStartにどう乗せるかを
考えてもよいのではないでしょうか。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2006-09-27 16:54
実際にやったことがないのでイメージだけですが、Applet-Servlet間通信を利用してクライアント側に保存させることは可能ではないでしょうか?

イメージ
Applet内で画像ファイルの編集

生成された画像イメージをサーブレットに転送

サーブレットはHTMLに書き出し

ユーザは画像ファイルをローカルに保存

この方式であればサンドボックスの制限を受けないと思います(ただしサーブレットはAppletが配置してあるサーバと同一サーバ上にある必要がありますが)

サーバ側の作りこみや通信部分の処理など工数はかなり増えると思いますが参考までに。

1

スキルアップ/キャリアアップ(JOB@IT)