
MIDPアプリを作成している初心者です。
Image データを一旦端末のレコードストアに保存しておく為、
getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。
↓のように レコードストアに書き込むメソッドを書いてみました。
public void writeRecordStore( String name, Image image ) {
int width = image.getWidth();
int height = image.getHeight();
int[] pxData = new int[ width*height ];
byte[] byteData;
RecordStore rs = null;
try {
//画像をバイトデータに変換
image.getRGB( pxData, 0, width, 0, 0, width, height );
//レコードストアを開く
rs = RecordStore.openRecordStore( name, true );
//バイト配列に変換 ← ここがわからない
//レコードの追加
rs.addRecord( byteData, 0, byteData.length );
} catch( Exception e ) {
}
}
int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。
また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。
No.2
- 回答日時:
/**
「レコードストアって何?」っていうレベルなので、
もしかしたら、とんちんかんな回答になっているかも。
*/
public class Convert{
int[] pxData;
byte[] byteData;
Convert(){
pxData = new int[] {Integer.MIN_VALUE,
-10,0,10,
Integer.MAX_VALUE};
byteData = new byte[pxData.length];
}
public byte[] convertByte(int[] intArray){
byte[] byteArray = new byte[intArray.length];
for (int i = 0; i < intArray.length; i++) {
if(intArray[i] < Byte.MIN_VALUE){ // -128より下。
byteArray[i] = Byte.MIN_VALUE;
}else if(intArray[i] > Byte.MAX_VALUE){ // 127より上。
byteArray[i] = Byte.MAX_VALUE;
}else{
byteArray[i] = (byte)intArray[i];
}
}
return byteArray;
}
public static void main(String[] args){
Convert c = new Convert();
System.out.println("pxData:");
for (int px : c.pxData) {
System.out.println(px);
}
c.byteData = c.convertByte(c.pxData);
System.out.println("byteData:");
for (byte by : c.byteData) {
System.out.println(by);
}
}
}
参考URL:http://members2.jcom.home.ne.jp/take_1118/java25 …
ご回答ありがとうございます。
しかし今の私にはご教示頂いたコードがすぐに理解できません。
また、ご紹介頂いた参考URLに関しても
今回の質問の主旨とは外れるかと思いました。
No.1
- 回答日時:
int型は32ビット、byte型は8ビットなので、int型のn要素の配列をbyte型のn*4要素の配列に変換することになります。
byteData = new byte[pxData.length * 4];
for (int i = 0; i < pxData.length; i++) {
int x = pxData[i];
byteData[i*4] = (byte)((x >> 24) & 0xFF);
byteData[i*4+1] = (byte)((x >> 16) & 0xFF);
byteData[i*4+2] = (byte)((x >> 8) & 0xFF);
byteData[i*4+3] = (byte)(x & 0xFF);
}
確認はしていませんが、大ざっぱにはこんな感じです。
この回答への補足
正確に書き直します
public void writeRecordStore( String name, Image image ) {
int width = image.getWidth();
int height = image.getHeight();
int[] pxData = new int[ width*height ];
byte[] byteData = new byte[ width*height*3];
RecordStore rs = null;
try {
//画像をイント配列データに変換
image.getRGB( pxData, 0, width, 0, 0, width, height );
//レコードストアを開く
rs = RecordStore.openRecordStore( name, true );
//バイト配列に変換
for(int i=0;i<pxData.length;i++){
byte red=(byte)((pxData[i]>>16) & 0xff);
byte green=(byte)((pxData[i]>>8) & 0xff);
byte blue=(byte)((pxData[i]) & 0xff);
byteData[3*i]=red;
byteData[3*i+1]=green;
byteData[3*i+2]=blue;
}
//レコードストアに書き込む
rs.addRecord( byteData, 0, byteData.length );
} catch( Exception e ) {
}
}
intの16~23ビットに赤、8~15ビットに青、0~7ビットに緑が入っている
という理由だそうです。
お礼遅れましてすみません。
そしてご回答ありがとうございます。
他のサイトで
byteData = new byte[pxData.length * 3];
for (int i = 0; i < pxData.length; i++) {
int x = pxData[i];
byteData[i*3] = (byte)((x >> 16) & 0xFF);
byteData[i*3+1] = (byte)((x >> 8) & 0xFF);
byteData[i*3+2] = (byte)(x & 0xFF);
}
という意見を頂きましたが、これは間違っていると思われますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaBeansの配列の値取得方法に...
-
ページング
-
C#で動的配列Listの中身をListB...
-
strutsで2次元配列をやりとりす...
-
この警告はどうすれば?
-
『args[]』とは?
-
[Ljava.lang.Stringってなんですか
-
Javaで文字と数字が混ざったも...
-
無名配列の作成方法について質問
-
javaでデータベース(mysql)か...
-
jspでの二次元配列
-
質問です。 配列が100以上の場...
-
javaでEUC-JP文字列→UTF-8への変換
-
strutsでの配列の扱い方について。
-
ArrayListからBean配列に値をセ...
-
cloneメソッドについて (java)
-
セッションを使ったint型の値の...
-
大きさがわからない配列
-
IF関数でEmpty値を設定する方法。
-
ORA-01858: 数値を指定する箇所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
Javaで文字と数字が混ざったも...
-
配列について
-
C#で動的配列Listの中身をListB...
-
ArrayListからBean配列に値をセ...
-
この警告はどうすれば?
-
配列で、値の入っている要素数...
-
配列をセッションに割り当てた後で
-
同じ配列またはクラスを、2回...
-
配列の中に複数存在する数がい...
-
ページング
-
JavaBeansの配列の値取得方法に...
-
配列数を超えてアクセスしたと...
-
n番目に大きな値を探索する
-
C言語でunsigned char配列を連...
-
java
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
for文とStringBuffer
-
【Ajax通信&Java】配列の受け取...
おすすめ情報