2006年08月15日

MIDPのkeyRepeatについて

(´・ω・`)ノシ

えー、最近Oblivion Angelsのゲーム作成だけじゃマンネリ化してきたので、もう一つアクションゲームを作り始めますた。

一言で言うと
『縦スクロールしないシューティングゲームの様なアクションゲーム』
です。

……

……まぁ、今のところ単純なアクションゲームだと言う認識でいてください。

で、プログラムしている途中で、チョット『あれ?』と思った事があるのでその対処法をカキコしときます。

実は、MID2.0にはkeyRepeatedというメソッドがあるのですが、ハッキシ言って「使えません」
えぇ、ムカつきます。
何でこんなムダなメソッドなんぞ作ったんかー!
タダでさえ少ねぇケータイメモリー圧迫してんぢゃねーぞ!(゚Д゚)ゴルァ
って感じです。

このメソッド、動作してる事はしてるらしいんですが、普通のこんぷーたーのキーボードのリピート機能っぽい動作をするそうです。
なので、キーが押されてからタイムラグが生じるみたいです。
(僕の場合はとにかくメソッド自体動作して無いようにみえたのですが)

まぁとにかく使えねーんでどうするかというと、結局keyPressedkeyReleasedを併用するしかないみたいです。

対処法としては

1.適当なboolean変数を作る。(private宣言でOK)
2. keyPressedでbooleanをtrueにする。
3. キーが押された時の処理をする。
4. 適当なメソッドを作ってbooelanがtrueの時の処理をする。(メソッドはゲームのメインループに置く)
5. keyReleasedでbooleanをfalseにする。
6. キーがリリースされた時の処理をする。


っていう風にします。
まぁ簡単っていやぁ簡単ですけどね。w

ちなみにgetKeyStateって言うメソッドも容易されていますが、こういった『チャージ効果』を再現するには、『いつキーが押されたか』や『いつ放された』かが分かりにくいのであまり向いていません。

地道〜にやっていくしかないんですね……(´・ω・`)


posted by 1.618 at 01:15| Comment(10) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年08月09日

携帯用オリジナルゲームの近況(バグハケーン!)

(´・ω・`)ノシ

うひー!
現在作ってるOblivionAngelsのゲームメジャーなバグハケーン!! orz

……と言っても普通にプレーしてる分には問題なかったのですが。

バグの詳細ですが、

『ユーザーの選択肢による自動分岐機能のところで分岐設定が二つしかできない』

というものでした。

今のところ自動でシナリオが分岐するところは二つしかないので良かったのですが、今回のシナリオ追加で自動分岐が三つになったためバグがハケーンされました。orz

対処法として、

『forループを使って設定ファイルの中身の数を限定していたのですが、whileループに変更して設定ファイルの中身が無くなるまでシナリオ分岐の設定を続ける』

という風に変えました。

やれやれ……

原因は、

設計ミス、
テストケース不十分、


……ってトコですかね。w
しかも今まであまり使わなかった機能ですし。w

まぁ現在は完全に治って動いてますんで、悪しからず。 (^ω^;)
posted by 1.618 at 16:57| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年07月30日

自作ゲーム開発の近況

最近就活で結構忙しいんで、ゲーム開発がすすまねぇです…… (´・ω・`)
……まぁ、仕方ないですけど。

えー、最近ウイルス感染して(泣)Windowsをリインストールしたんですが、それと同時にデバッグ用に取っておいたエミュレータのセーブデータが御亡くなりになりますた…… 煤i ̄口 ̄;)

3200+行あるストーリーなんでセーブデータ消えるとデバッグとかアニメーションの確認とかやる気なくなります! いや、マヂで。orz

で、仕方ないんで選択肢の所に飛ぶ機能を追加しました。
『何処のページの何処へ飛ぶ』って指示を出すファイルから情報を読み込むほうが処理が早くなるのでそうしようかとも思ったんですが、それだと選択肢を作るたびに追加しないといけないので『全て自動』で検索を行うようにしました。(ただ、ループ処理で一行ずつ検索していくんで、案の定遅いです……)

考えどころとしては、
1.ページ表示後強制的にジャンプするところ
2.ユーザー選択肢によって自動的にジャンプするところ


です。
そして、僕のソフトの場合つくり途中のを随時更新して公開しているので次の事も考えました。
3.ゲームオーバー、コンテニューの画面(物語がぶちきれてる所)で止まる

テキストスキップのクラス作って、ロジック作って、テストして……大体三日くらいの作業でした。

oblivion8.jpg
↑新しいメニューの追加かんりょー!

で、肝心の物語のほうはようやく終盤にとつにゅるです!
『罪付き』となった天使の行く末は……!?

oblivion9.jpg
↑熾天使アスモデウスの再来!

Oblivion Angelsのほむぺ
posted by 1.618 at 12:34| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年07月15日

MIDPゲームの近況

結構前から作ってたゲームもシステム的にはまぁ閑静してきました。
メニューも作ったし、ゲームオーバー画面も作ったし。
ただ、画像処理を鬼のようにするので無茶苦茶重いです……
フルスクリーンでPNGファイルを何枚か表示する戦闘シーンとか、タマに落ちますです……
こればっかりはどうしようもないんで……

oblivion6.jpg
↑タイトル画面です。

後開発しないといけない所は、メッセージスキップ機能ですかねぇ……
昨日どうもWindowsがおかしいと思って再インストールしたんですが、エミュレーションで保存してたシナリオのセーブデータが全部パーになっちゃいました……川orz

シナリオは現在3200行位書いてます。
スキップ機能は必須ですね……川orz
わかりますた。作ります。(泣

oblivion7.jpg
↑二人いるヒロインの内の一人。

……現在二つの大きなシナリオ分岐があって、一つ目のシナリオを作ってるんですが、システム作りよりこっちのほうがシンドイです。
物語とか作るのは好きなんですが、国語で赤点ぎりぎりとってましたからねぇ。あははー。(棒読み

まぁ、このゲームはフリーなんで、悪しからず。w

後、長い間ご無沙汰してた時期がありますが、OblivionAngels専用のウェブページ作ってました!
今日このきっかけに公開します!
デモソフトや壁紙ダウンできるんで、よかったら見にきてください。

ちなみにサムネイルは実物大です。
JPG変換してるんで、クオリティは実際よりちょっと劣ります。
posted by 1.618 at 17:05| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年04月17日

MIDPゲームの近況

段々サマになってきますた〜!

セーブ&ロード出来るようにしたんでケッコウいい感じでシナリオ作りできてます。

処理の流れは↓みたくなってます。

1.テキストファイル画像(パス)ファイルアニメーションファイルの読み込み。

2.画像(パス)ファイルから必要な画像のデータをImage型で読み込み、アニメーションがあればスタートさせる。表示。

3.テキストファイルから必要なものを抜き出して、表示形式に変換。表示。

4.キー入力があればメニューか、改ページに分ける。

5.現在のテキストファイルをすべて表示したら、次のテキストファイルとアニメーションファイルを読み込む。

6.(2.)に戻る。

ってな感じです。

アニメーションファイルで現在指定できるのは、上下左右からのフェードイン・アウト、上下左右への移動位ですね。
そのままブラーかけてのフェード効果は……まぁ前回説明しましたけど、ぶっとびますんでやめてます。w

それぞれのアニメの方法はstaticメソッド指定なんで、ソースに追加すれば簡単に何か作れます。例えば二次方程式なんかとか。w

↑の処理りストではえっらい簡単に書いてますが、それぞれケッコウ複雑な処理してます

例えば、フェード処理が終わったら自動的に次のページをめくるとか、データロードしたとき、この前一番最後にプレーしたアニメーションをやり直すとか。

あとはシナリオ作るだけですが、これが一番大変ですね……才能ねぇのに絵ェ描いたり文章書いたり……orz

demo1.jpg
↑ゲーム画面その1

demo2.png
↑ゲーム画面その2

ある程度まで出来たらデモ版リリースしようと思ってます……
多分NOKIA702NK(I・II)専用で。
posted by 1.618 at 19:41| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年04月07日

MIDPでの画像取り込み時、気をつけたらいいかもしれないこと

J2MEも普通のJavaと同様、アルファブレンド、反転、拡大縮小…何だって出来ることは出来るんですが……

…結論から言って


や ん な


です。

画像が小さければ問題ないです。
ケータイの2Dシューティングやアクションゲームのキャラクターの大きさなんてたかがしれてます。

なんですが、僕が今作ってるのはアドベンチャーゲーム。

トーゼン、
画面範囲外に飛び出した広大な「背景」+大岩のような「立ち絵」xα
の処理になる訳です。

僕の使ってるのは前にも紹介したNOKIA702nkIIなんですが、

フェードアウトのエフェクトかけると「も〜ダメ〜! そんなおっきいの入んない〜!」ってメモリーちゃんが悲鳴を上げて失神してしまいますた。


……
………
げふんげふん。


……え〜、背景はJPGのクオリティー最低のもの。フォトショで調整します。

sunset1.jpg
↑273x208の画像で大体2.86KB。かなりちっちゃくできます。


キャラクターの立ち絵イメージの型はPNG24。アルファチャンネル使って半透明したいんで。

……これが、でけぇんですよ、マヂで……orz

michael11.png
↑103x153の画像で27.8KB……ふざけんなっ!!!って叫びたくなります。

ただ、半透明処理が出来て、Javaで取り込み可能で、比較的小さいサイズに出来るもの……ってのがPNG24しかないので、泣く泣く使うことにします……

……メモリー頑張ってくれ……俺のってスゲーデカイんだ……

……で、出来上がりはこんな感じ。白い縦線はきにしないで下さい。
gamen1.jpg
↑エミュレータ上での画像。

gamen2.jpg
↑実機での画像。

使ったのは

createImagedrawImageだけ。

イメージのパスのみを最初に外部ファイルから読み込んでおいて画面でそのイメージファイルが必要ならばその時にcreateImageでJava側に持ってくるようにしています。

画面表示が変わった時少々ロード時間がかかってしまいますが、最初にイメージファイルを全て読み込もうとすると前にも書いたようにメモリーが「もうダメ〜! イッちゃう〜!」って悶えるのでやめといてあげます。(ほっといたら気絶しちゃうし。w

はぁ〜……ケータイのアソコってホントちっちゃいですね。入れるのに一苦労です。
……まぁデスクトップ(Swing)のガバガバのアレよか刺激があっていいのかもしれませんが。



……
………
げふんげふん。

でわでわ。
posted by 1.618 at 17:06| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年04月01日

難解化ツール:ProGuard

ProGuardは「Obfuscator(難解化ツール)」の一つです。
ObfuscatorとはJavaクラスファイルの逆コンパイルをしてソースを盗み見る事を防ぐツールです。
もう一つの利点はコンパイル時に自動的にJarファイルの最適化が行われ、クラスファイルのサイズが小さくなるそうです。

んじゃま、云ってもしょーが無いんで早速インストールします。
インストール自体は簡単。→Proguardほむぺ
ダウンロードしてどっかのフォルダにぶち込むだけ。

…ざっとドキュメント見たんですが、何かパス設定の事が書いてないんですけどしないんですけど…まぁGUIがあるからいいのかな?
GUIはケッコウ軽いしカッコイイです。

proguard01.jpg
↑GUIフロント。生意気にもアニメーションしやがります。w

…まぁEclipseMeがあるからGUI使わないですけど。(EclipseMeについては過去の記事を参照してくださいです)

ではEclipseMEでのProguardの設定をしますが、これが中々曲者です。
…いや、やる事はProguardのJarファイルを指定するだけなんですが、EclipseMeからその設定画面に行くまでが大変っつうか分かり難いっつうか…orz

作ってあるMidletProjectから:

Properties」→「J2ME」→「Manage Devices」→「Packaging」→「Obfuscation」→「Browse

と行ってProguardのルートディレクトリを指定します。



……

………ふざけんな!!

って思わず叫んでしまいそうに長いし分かり難い所にありますが、分かりやすく一画面でまとめてみたのでみてみてみてください。

proguard02.jpg
↑Proguardのルートを設定する所。

…で、コンパイルなんですが…

"Proguard not correctly configured"

って僕のマシンでは出てきてしまいます…orz

がー! ムカツク!
ナゼぢゃー!
posted by 1.618 at 12:19| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年03月26日

MIDP2.0メモリー不足エラー発生!(泣)

…こないだ紹介したアドベンチャー系ケータイゲームなんですが、またもやしかも特大!)にぶち当たってしまいますた……

デカめの画像を複数表示する時、OutOfMemoryErrorが出てしまうのです…

Sunホームページによると、

メモリ不足のために Java 仮想マシンがオブジェクトを割り当てることができず、ガベージコレクタによっても使用可能なメモリをこれ以上確保できない場合にスローされます」

だそうです。

要するに(イメージも含めて)メモリ内のデータ量が多くてメモリ領域確保出来ねーヨ馬鹿!って言われた訳です…(泣)


現在は全ての情報(画像、文字、アニメーション)を起動時に読み込んでるのですが、ページごとに切り替えようかなと…
速さを求めてそうしたのですが、裏目に出てしまったようです…

それと、Spriteクラスを使ってるのですが、アクションゲームじゃないのでそのままImageクラスを使う方がいいかと。
余分なメモリーを使わないのでメモリ領域も少しは確保できるかもしれません。

今回メモリー領域確認の為使用したコマンドは、

Runtime run = Runtime.getRuntime();
String freememinfo = run.freeMemory();
String totalmeminfo = run.totalMemory();


です。これで現在フリーのメモリー量全体のメモリー量がわかります。

ってことで今後の修正方針は:

1.ページごとにリソースをIOから読み込んで各データ(画像、文字、アニメーション)をメモリー内に確保する。

2.Spriteクラスで処理していた画像データをImageクラスに直す。


で様子をみてみます…

はぁ、設計ミスだなこりゃ…サイアク…
posted by 1.618 at 23:46| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年03月17日

MIDP2.0におけるリソースの読み込み

ご無沙汰です。

色々のプライベートで入り込んでてブログ更新遅れてます。

最近はこないだやった「Fate」が面白かったので、テキストアドベンチャーゲーム作ってます。MIDPで。

画像系の処理は、Spriteクラスを使います。別にImageクラスでもいいかなと思ったんですが、回転やミラー処理の事考えてSpriteクラスを使います。(継承させてフレーム数とか、初期のX、Y値を保存させる)

画像系の処理は比較的簡単。
もう殆ど出来上がりっぽい所まで来てます。

……なんですが、問題はI/Oと文字処理です。
これらは直にハードと関わるので、Javaを使ってても調整や設定が非常に難しいです。

僕の持ってる機種はボーダフォン
Nokia702nkII

なのですが、プログラミングする上ではケッコー癖の強い機種って事が判明しますた。w

この機種、海外メーカーだからかもしれませんが、普通に日本語をファイルから読み込むようにプログラムすると余裕で文字化けします…!orz
mojibake2.jpg
↑エミュレータ―上ではちゃんと表示できますが……

mojibake1.jpg
↑実際のマシンにインストールすると化けます……orz

ホント、こういうバグって勘弁してほしいです……

昨日から相当調べてたんですが、nokia製品は文字コードにunicode、UTF-8を使っているって事がわかりました。

で、色々試してたんですが、結果、次のようにしたらうまくいきました。

1.日本語のファイルを「UTF-8」に変える。
  やり方としては、Eclipseでファイルを作成して、そのファイルを右クリック→「properties」→「Text file encoding」を「others」→「UTF-8」にする。

2.inStreamを利用したコードでファイルを取り込む時、Stringをnew String(string, "UTF-8")で変換する。

  byte[] work = new byte[bytesize];
  int size=0;
  InputStream in = null;
  try{
    in = getClass().getResourceAsStream(str);
    size = in.read(work);
    in.close();

    return new String(work, "UTF-8");
  }
  ……

って感じです。

これらを行った後、エミュレータ、実機で検証してみます。
mojibake4.jpg
↑エミュレータではちゃんと表示されています。実機では……?

mojibake3.jpg
↑成功!!やたー! (^o^)/

文字が画面からはみ出てしまってますが、まぁとりあえずリソースから日本語を読み込み、表示させるって所までは成功しました!

上のコードではreadメソッド一行でリソースを全て読むようにしていますが、ノキアサイトのドキュメントによると、上のやり方だと全てデータを読み終わらないのに結果が出てしまう場合があるそうです。なので、whileループで拾ってあげます。

byte[] work = new byte[bytesize];
int size=0;
InputStream in = null;

try{
 in = getClass().getResourceAsStream(str);
 if (in == null) return null;
 DataInputStream din = new DataInputStream(in);
 int bytes = 0;
 int offset = 0;
 while (true) {
  bytes = din.read(work, offset, work.length - offset);
  offset += bytes;
  if (bytes == -1 || offset >= work.length) {
   break;
  }
 }
 din.close();
 String s = new String(work, "UTF-8");
 return s;
}

これで完全!なハズ!!

今回のI/O系統のソースです。
IOUtil.java
posted by 1.618 at 22:58| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2006年01月08日

MIDPでHelloWorld

新年明けました!
おめでとうございました!

今年最初の記事はJavaでいきます!

この前はJ2MEのインストール方法をしょーかいしたので、今回は実際にプログラムを組みたいと思います。(Eclipse環境で

ではまずテキトーにプロジェクトを作ります。「File → New → New Project」でテキトーに名前とかいれて作ります。

次にMIDletクラスを作成します。(mainメソッドのようなもの)
作成したプロジェクトフォルダーを選択して右クリックしてポップアップメニューを開きます。
New → Other」で「J2ME Midlet」を選択します。テキトーに名前入れて終わりです。

ココまで終了すれば
startApp()
pauseApp()
destroyApp(boolean)

という3つのメソッドが出来るはずです。

startAppはアプリが立ち上がった時によばれるメソッドで、ココでCanvas(JavaSwingで言うとJPanelっぽいもの。)を初期化させます。

pauseAppは電話とかかかってきた時とかに呼び出されるメソッドです。あんま気にしないでいいです。

destroyAppはアプリ終了の時に呼び出されます。これも気にしません。

メインとなるMidletクラスの作成は以上で終わりです。

次にHelloWorldを表示させるCanvasクラスを作ります。
このクラスは絵を描くときのキャンバスそのものです。

作成したプロジェクトフォルダーを選択して右クリックしてポップアップメニューを開きます。
New → Class」で出てくるダイアログの「Name」にテキトーな名前を入れます。その下にある「SuperClass」に「javax.microedition.lcdui.Canvas」といれます。

「OK」ボタンを押すとクラスが作成され、paint(Graphics arg0)というメソッドが作成されているはずです。ここにJPEGとか線とかを描きます。

今回は「明けました。おめでとーございました。」という文章を表示させたいと思います。

Midletクラスに追加するコードは
HelloCanvas maincanvas = new HelloCanvas(); //自分で作ったCanvasクラス
Display.getDisplay(this).setCurrent(maincanvas);

です。
これはキャンバスにHelloCanvasを使います。
キャンバスを今から表示させます。

と言う命令文です。

Canvasクラスに追加するコードは
arg0.drawString("明けました。おめでとーございました。", 0, 10, Graphics.TOP|Graphics.LEFT);
です。
これは「x=0, y=10の所に左上を中心にして文章を表示させます」という命令です。

実行方法
Run」ボタンを押し、「New」で「Wireless Toolkit Emulator」に新規追加します。
Project」に作成したプロジェクト名を入れ、「Executable」で「Midlet」ラジオボタンを選択し、今回作成したMidletクラスを入れます。

Run」ボタンを押し、成功すると下のように表示されるはずです。
hello1.jpg


慣れればココまでの作業は大体5分以内で出来ちゃいます! Javaって簡単ですね〜!

今回作成したもののソースを上げときます。
BlogMidp.zip

posted by 1.618 at 11:38| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年12月30日

J2ME(MIDP環境)をインストール

ヤター!
仕事オワタ〜!
休みクルー!

早速ブログ更新!(笑)

今回はJavaネタで、J2MEをいじってみます。

ぶっちゃけ無茶苦茶簡単にプログラミングできます!

まずは開発環境を整えなきゃいけません。

僕はEclipse派なのですが、J2MEに特化した環境が欲しい人ならJBuilderがオプション(フォームデザイナーやフォーム同士のリンク付け)付きのヤツを出しています。

Eclipseは、
1. J2MEダウン/インスコ
2. EclipseMEダウン/インスコ
3. 内部設定

って感じの作業。

JBuilderは、
1. JBuilderダウン/インスコ
で終わっちゃうので(笑)初めてJ2ME、Javaを触る人はJBuilderのほうがお勧めかむしれません。

ちなみに、僕はビンボーなんでココで紹介するソフトはみんなタダです!(笑)

JBuilderはインストール方法もナニも、サイトからダウンしてインスコすればいいので何も紹介することはありません。(笑)


Eclipseはちょっとメンドーなんでコツを書いときます。

1. Eclipse→ダウン/インスコ(日本語化。僕はメンドーなんでやりません…)
2.J2ME→ダウン/インスコ

ココまでは簡単。

次にEclipseMEのPluginをEclipse内で設定して自動インスコ・更新させちゃうようにします。

3.Eclipse起動
4.Eclipseのメニュー「ヘルプ→ソフトウェア更新→検索とインストール」
5.「インストール/更新ダイアログ」にて「インストールする新規フィーチャーを検索」を選択
6.「インストール」ダイアログで「新規リモートサイト」押す
7.出てきたダイアログの名前欄に「EclipseME Update Site」、URLに「http://www.eclipseme.org/update」とします。

後は気を使いながら「次へ」ボタン連打。(笑)

で、EclipseMEの環境設定です。

8. Eclipseのメニュー「ウィンドウ→設定」
9.設定ウィンドウのツリー「J2ME→PlatForm Components」
10.「Wireless Toolkits」を選択、右クリックで「Add Wireless Toolkit」を選択、関連付けたい「J2ME Wireless Toolkit」のルートを指定します。(C:\WTK22)

デバッグの設定をします。これをやらないとデバッグ出来ない時があります。

11.Eclipseのメニュー「ウィンドウ→設定」
12.設定ウィンドウのツリー「Java→デバッグ」
13.「キャッチされない例外で実行を中断」のチェックをはずす
14.「デバッガー・タイムアウト」に「15000」を設定

終わりです。

長くなってしまったので今回はココで終わりにします。
次回はEclipseを使ってお決まりの「HelloWorld」でもしようかと。w

あ、忘れてた!
J2MEをインストールする前にJ2SEをインストールしとかないといけません!



<参考リンク集>
J2SE:http://java.sun.com/j2se/1.4.2/ja/download.html
J2ME:http://java.sun.com/products/sjwtoolkit/download-2_2.html

Eclipse:http://www.eclipse.org/downloads/
EclipseME:http://eclipseme.org/

JBuilder(J2MEバージョン):http://developers.sun.com/prodtech/javatools/mobility/downloads/index.jsp
posted by 1.618 at 09:32| Comment(2) | TrackBack(1) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年11月25日

Javaでブラー効果

Javaでブラー効果をします。

blurneko.jpg
↑にゃ〜ん

今回重要なクラスは

Kernel
BufferedImageOp
ConvolveOp


です。

まず、Kernelを宣言します。
JavaDocによるとKernelとは、

「指定されたピクセルについて、フィルタオペレーションで出力されるイメージ中での位置に対する値の計算に、あるピクセルとその周囲のピクセルがどのように影響するかを記述するマトリックスを定義します。X 原点と Y 原点は、カーネルマトリックスの中で出力値の計算対象となるピクセル位置に対応する要素を示します。」

だそうです。 ……ハイ、意味分かりません。w

この値を変える事でイメージの状態が変化するんですが、僕も詳細はあまりよく分かってません。Burn状態Dark状態になることは確認しました。
自分で色々試してみてください。w

次にConvolveOpKernelを実装します。
JavaDocによると、

「ソースからデスティネーションへの畳み込み演算を実装します。」

だそうです。
簡単にいえばソースイメージをKernelを使って変更するって事だと思います。

で、BufferedImageを宣言します。
ここで重要なのが、

BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR

ってとこです。

僕の使ったJPEGイメージだとTYPE_INT_RGBだけではエラーが出ます。

java.awt.image.ImagingOpException: Unable to convolve src image

イメージ変換できね〜」って言ってますね。生意気な!

いろいろ調べてみたらKernelやらConvolveOpを使ってのイメージを変換する時、pngやjpgなど種類に依存してしまうようです。

なので、、どのイメージはどのオプションが必要かというのを調べる為に前回紹介したImageDump.zipを使って調べます。

imageinfo.jpg
↑赤いところで囲っているところに注目!

このJPEGはTYPE_3BYTE_BGRってタイプですんで、BufferedImageを宣言するときにこのオプションをつけてやります

植えて紹介した、
BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR
がその結果です。

ちょっと長くなってしまいましたが、今回ポイントとなるコードをまとめときます。

Kernel kernel = new Kernel(3, 3,
 new float[] {
 1f/9f, 1f/9f, 1f/9f,
 1f/9f, 1f/9f, 1f/9f,
 1f/9f, 1f/9f, 1f/9f}
);

BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);

BufferedImage bufferedImage =
new BufferedImage(
 img.getWidth(),img.getHeight(),
 BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR);
 op.filter(img, bufferedImage);

arg0.drawImage(bufferedImage, img.getWidth(), 0, this);

です。

BlogBlur.zip
↑今回のソースです。
posted by 1.618 at 21:41| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年11月23日

JPEG等のイメージの詳細を調べるコード

前回までに回転グレースケール化の仕方をお話しました。
で、トーゼンブラー効果もある訳ですが… これがちょっと曲者です…

ブラー効果に使うAPIは特定のイメージフォーマットしか受け付けないので、まずはイメージの詳細を調べるコードを作成

ImageDump.zip
↑ソースです。

Staticなメソッドなんで使い方は簡単。
知りたいイメージをBufferedImageとして読み込んでImageDumpを使用するだけ。

try{
 File f1 = new File("someimage.jpg");
 BufferedImage img = ImageIO.read(f1);
 ImageDump.dump(img);
}
catch(Exception e){
 System.out.println("Error reading image");
}

とすればいいです。

ディスプレーされる情報は、

BASIC BUFFEREDIMAGE ATTRIBUTES
COLOR SPACE
COLOR MODEL
RASTER
DATA BUFFER
SAMPLE MODEL


って所です。

でわっ!
posted by 1.618 at 08:46| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年11月12日

JavaでRGBから白黒イメージを作る

今日の画像系JavaTips普通のRGB画像から白黒に変換さして表示させるというものです。

ハッキリ言って前回のフリッピングよりも格段に簡単です。

nyannyan2.jpg
↑にゃ〜ん!w

今回重要なクラスは
ColorSpaceColorConvertOpです。

ソースは

//change RGB to Gray
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage bufferedimage = op.filter(img, null);

とします。

今回もアプレットにすると重いのでJPanelを使っています。Javaがインストールされている環境では.jarファイルをダブルクリックするとサンプルが稼動します。

BlogSite2.zip

でわ!
posted by 1.618 at 19:39| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年11月10日

Javaでイメージを回転させる方法

Javaで画像処理します!

nya-n1.jpg
↑にゃーん!w

うーん、萌えー!w (ゲフンゲフン…

えー、キーになるクラスはAffineTransformAffineTransformOpです。

まず最初にイメージをBufferedImageにいれて、
AffineTransformAffineTransformOpを使って加工し、最終的にBufferedImageに入れ直して表示します。

// Flip the image vertically
AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
tx.translate(0, -img.getHeight());
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage bufferedImage = op.filter(img, null);
arg0.drawImage(bufferedImage, img.getWidth(), 0, null);

って感じです。

簡単ですよねっ!

んじゃっ!

BlogSite1.zip
↑ソースです
posted by 1.618 at 21:23| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする

2005年10月30日

IO関係のクラス作ってみました。

ハッキリ言って、僕はIO関係のプログラミングが苦手です…

C/C++とかではIOプログラミングでエラーが出るとフリーズしたり文字化けしたりで、もうワケワカラン状態になってしまうからです… しかもエラーメッセージも無し…

Javaでは比較的簡単にIOプログラムを組むことが出来ますが、FileクラスやらBufferedReaderクラスやら結構複雑です…

なので、個人的なクラスを作ってまとめてみました。

TxtFileHandler.java
(パッケージはディフォルトのままにしてあります。)

使い方はいたって簡単。

データを読み込む時は、

TxtFileHandler tf = new TxtFileHandler("c:\String.txt");

とかやってイニシャライズさせます。
これをやることでファイルの中身が一行ずつVectorに格納されます。
そのVectorを確保するには

tf.readData()

でVectorが帰ってきます。

データを書くときは、

TxtFileHandler tf = new TxtFileHandler("c:\String.txt", true);

で書き込みのファイルを作成します。ちなみにtrueは上書きするかしないかを判断します。
(あくまでファイルの作成。データは入りません)

書き込むときもVectorしか受け取らないので、

Vector vc = new Vector();
vc.add(new String("Hello");


とかでVectorを作っておいて、

tf.writeData(vc);

でファイルに書き込みます。

簡単ですよね? w

おまけでgetBrokeDownVecってstaticなメソッドも作って見ました。
使い方としては、言葉で説明するより見てもらった方が簡単なんで…

まず、

String st = "asdf1|asdf2|asdf3|asdf4";

とか、”|”で文章が区切られていたとします。で、これらを分解したい時に、

Vector vc = TxtFileHandler.getBrokeDownVec(st);

とすると,

何と何と!

asdf1
asdf2
asdf3
asdf4


という4つのデータが入ったVectorが帰ってきます!

便利でしょ? w

JavaのAPIにもStringTokenizerってのがある(僕もこれを使ってます)んですが、設定が色々あってメンドクサイんですよね。
なので自分なりに簡単に出来るようにしてみました。

…残念ながらJavaDocは作ってません… ごめんなさい。w
posted by 1.618 at 16:20| Comment(0) | TrackBack(1) | JavaTips | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。