- PR -

Object型からbyte[]へのキャストの仕方について

1
投稿者投稿内容
シミー
会議室デビュー日: 2004/02/22
投稿数: 16
投稿日時: 2004-03-17 19:47
getPixelsメソッドを使用して、最終的にbyte[]を取得したいのですが、
java.lang.ClassCastException: [I のエラーがでてしまいます。
どのようにキャストすれば、よいのでしょうか?

-----------------------------------------------------------------
↓ エラーがでます。java.lang.ClassCastException: [I 

byte[] bytepix = (byte[]) pg.getPixels();

↓ こちらは、値を取得できます。

int[] intpix = (int[]) pg.getPixels();
-----------------------------------------------------------------

↓ Java 2 プラットフォーム SE v1.4.0)より

public Object getPixels()
ピクセルバッファを返します。
ピクセルを保持する明示的なピクセルバッファで PixelGrabber が作成されなかった場合、
このメソッドはイメージのサイズおよび形式がわかるまで null を返します。
ソースイメージが複数の ColorModel を使用してデータを転送する場合は常に、
PixelGrabber はデフォルト RGB ColorModel でデータを蓄積しようとするので、
このメソッドで返される配列オブジェクトは、イメージの取得が完了するまでの間に変化する可能性があります。
戻り値: byte 配列または int 配列
関連項目: getStatus(), setPixels(int, int, int, int, ColorModel, byte[], int, int), setPixels(int, int, int, int, ColorModel, int[], int, int)

でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-17 21:16
キャストの仕方というよりか、java.awt.image.PixelGrabber の使い方ですよね?
int[] 型のピクセルでなく、byte[] 型でなければならない理由とかあるのでしょうか?

〔追記〕
後、PixelGrabber がどのようにインスタンス化されて、どのような操作をされたかを書いたほうが、回答が得られ易いと思いますよ。

[ メッセージ編集済み 編集者: でゅうく 編集日時 2004-03-17 21:23 ]
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2004-03-18 09:19
http://www.vc-net.ne.jp/~ytp/bbs/java/index.html

前回の減色に関する質問でも、
結果報告を双方にきちんとしていませんね。
シミー
会議室デビュー日: 2004/02/22
投稿数: 16
投稿日時: 2004-03-18 11:46
返信ありがとうございます。

読み込んできたイメージより、pixel単位で変換をかけるために、PixelGrabberクラスを使用して、

コード--------------------------------------------------------------------------

// 指定された ImageProducer が生成するイメージからピクセルの矩形部分を指定された配列に取り出す。
PixelGrabber pg = new PixelGrabber(image, 0, 0, imageWidth, imageHeight, pixels, 0, imageWidth);

// pixelsの各配列には各ピクセル情報を取得。
pg.grabPixels();
     ・
     ・ // 減色処理
     ・
// イメージのピクセルの転送。
pg.setPixels(0, 0, imageWidth, imageHeight,pg.getColorModel(),cPixels, 0, imageWidth);

// ↓byte[]型のデータとして取得したいのですが、エラーがでます。
  byte[] bytepix = (byte[])pg.getPixels();

--------------------------------------------------------------------------------

int[] 型のピクセルでなく、byte[] 型でなければならない理由なんですが、byte[]型で取得することにより、
イメージの変換後のデータサイズを取得することができます。
ほかに、良い方法があればよいのですが・・・。

--------------------------------------------------------------------------------

TomScissorsさん、ご指摘ありがとうございます。

大変失礼なことをしてしまい、深く反省している所存です。
私は、その言葉すら存じ上げず、今申し訳なささと、恥ずかしさでいっぱいです。

私はまだ、右も左もなにもわからないもので、いろいろなキャリアのある方のお話を数多くお聞きしたく、このような方法をとりました。
決して、軽視していたわけではないことは、ご理解ください。
以後、このようなことのないよう、十分気をつけたいと思います。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-18 14:07
PixelGrabberのコードを読むと、直ぐに原因がわかりますよ。
src.jarを解凍してみてください。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-03-18 17:47
PixelGrabber クラスのコンストラクタを眺めただけなので外しているかもしれませんが。

PixelGrabber.getPixels() が byte[] を返すのは、
(1) コンストラクタ PixelGrabber(Image, int, int, int, int, boolean) で作られている
(2) 第1パラメータの Image オブジェクトのカラーモデルが RGB でない
(3) 第6パラメータが false
のうちいくつか(すべてかも)を満たす場合に限るのではないでしょうか。

少なくとも他のコンストラクタで作った場合はカラーモデルを RGB に限定して int[] でバッファを与えているわけですから、それを byte[] で返せというのは虫の良い話に思えます。

あと、老婆心ですが、
引用:

私はまだ、右も左もなにもわからないもので、いろいろなキャリアのある方のお話を数多くお聞きしたく、このような方法をとりました。


「右も左もわからない」のだったらわかるようになってからプログラムを書くべきだと思います。
「いろいろなキャリアのある方」云々も、裏を読むと、一つの掲示板で回答される方を信用していないという大変失礼な意味にとれます。ご注意ください。

ご丁寧な挨拶も結構ですが、結果報告を実践されることを強く期待いたします。
1

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