プロが教える店舗&オフィスのセキュリティ対策術

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配列に変換する方法わかる方 ご教授の程お願いします。

また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

A 回答 (3件)

> intの16~23ビットに赤、8~15ビットに青、0~7ビットに緑が入っている


> という理由だそうです。
> これは間違っていると思われますか?

残念ながら、赤・青・緑の24ビットだけでは不完全です。
MIDPのImage.getRGB()は、24~31ビット目に透明度(α値)の情報を入れて返すからです。
    • good
    • 0
この回答へのお礼

お礼遅れまして申し訳ございません。

salsberryさんのご回答、納得しました。

ありがとうございました。

お礼日時:2009/08/23 09:46

/**


「レコードストアって何?」っていうレベルなので、
もしかしたら、とんちんかんな回答になっているかも。

*/
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 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

しかし今の私にはご教示頂いたコードがすぐに理解できません。
また、ご紹介頂いた参考URLに関しても
今回の質問の主旨とは外れるかと思いました。

お礼日時:2009/08/20 00:38

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ビットに緑が入っている
という理由だそうです。

補足日時:2009/08/20 00:31
    • good
    • 0
この回答へのお礼

お礼遅れましてすみません。
そしてご回答ありがとうございます。


他のサイトで
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);
}
という意見を頂きましたが、これは間違っていると思われますか?

お礼日時:2009/08/20 00:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!