0

これはシナリオです: Android OS に画像をロードします --> バイト配列に変換します --> SWT ベースのアプリケーションに送信します --> コンポーネントにロードします (わかりません、ラベル、ボタン...)。

バイト配列を正しく受け取りましたが、解析して画像に変換できません。

これは私がネットで見つけたユニークなコードで、動作します:

byte[] bs = { (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x00,
              (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x01,
              (byte) 0x10, (byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x22,
              (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x00, (byte) 0x11, (byte) 0x10, (byte) 0x02,
              (byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x30, (byte) 0x01, (byte) 0x10,
              (byte) 0x22, (byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x33, (byte) 0x01,
              (byte) 0x10, (byte) 0x22, (byte) 0x22, (byte) 0x01, (byte) 0x10, (byte) 0x33, (byte) 0x33,
              (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
              (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x01, (byte) 0x10,
              (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x01,
              (byte) 0x10, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
              (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x44,
              (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x55, (byte) 0x01, (byte) 0x10,
              (byte) 0x44, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x55, (byte) 0x01,
              (byte) 0x10, (byte) 0x04, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55, (byte) 0x50,
              (byte) 0x01, (byte) 0x11, (byte) 0x00, (byte) 0x44, (byte) 0x01, (byte) 0x10, (byte) 0x55,
              (byte) 0x00, (byte) 0x11, (byte) 0x11, (byte) 0x10, (byte) 0x00, (byte) 0x01, (byte) 0x10,
              (byte) 0x00, (byte) 0x01, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x00,
              (byte) 0x00, (byte) 0x11, (byte) 0x11, (byte) 0x11, };*/

Color white = display.getSystemColor(SWT.COLOR_WHITE);
Color black = display.getSystemColor(SWT.COLOR_BLACK);
Color yellow = display.getSystemColor(SWT.COLOR_YELLOW);
Color red = display.getSystemColor(SWT.COLOR_RED);
Color green = display.getSystemColor(SWT.COLOR_GREEN);
Color blue = display.getSystemColor(SWT.COLOR_BLUE);
// Create a source ImageData of depth 4
PaletteData palette = new PaletteData(new RGB[] { black.getRGB(), white.getRGB(),
yellow.getRGB(), red.getRGB(), blue.getRGB(), green.getRGB() });



ImageData sourceData = new ImageData(16, 16, 4, palette, 1, b);

しかし、バイト配列を変更すると機能しません。この場合、PaletteData と ImageData を設定するにはどうすればよいですか??

4

3 に答える 3

0
****It's work for me****

String filepath = "/sdcard/Image/Image01.jpg";
           File imagefile = new File(filepath);
            FileInputStream fis = null;
            try 
            {
                fis = new FileInputStream(imagefile);
            } 
            catch (FileNotFoundException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Bitmap bm = BitmapFactory.decodeStream(fis);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();  
            bm.compress(Bitmap.CompressFormat.PNG, 100 , baos);    
            byte[] b = baos.toByteArray(); 
            System.out.println(baos);
            Bitmap bm1=BitmapFactory.decodeByteArray(b,0, b.length);
            imgViewBitmap.setImageBitmap(bm1);
于 2012-12-29T03:48:01.930 に答える
0

ImageIO.read画像を解析するために使用できるはずだと思います:

InputStream in = new ByteArrayInputStream(imageDataByteArray);
BufferedImage bufImg = ImageIO.read(in);
ImageIcon icon = new ImageIcon(bufImg);
myButton.setIcon(icon);

BufferedImageのサブクラスなのでjava.awt.Image、そのまま使えるはずです。私はこれを自分でテストしていませんが、なぜ機能しないのかわかりません。

また、バイト配列をランダムに変更して、それが有効な画像を表していると期待することはできないことに注意してください。有効な画像データを含まない (またはサポートされていない形式の画像を含む) 配列を指定すると、ImageIO.readが返されnullます。詳細については、ImageIO.readドキュメントを参照してください。

于 2012-09-27T14:35:46.187 に答える
0

わかりました、正しい方法はこれです:

contact.setImage(pCur.getBlob(0));
publishProgress("befor compress");
Bitmap image = BitmapFactory.decodeByteArray(contact.getImage(), 0, contact.getImage().length);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 50, stream); //JPEG or what you want
contact.setImage(stream.toByteArray());
stream.close();

とにかく、整形式のバイト配列を送信できません。~1700 バイトのバイト配列を送信し、~2800 要素の配列を受け取ります。どうしてか分かりません。すべてUTF-8文字列でコーディングしています。ただし、ファイル内の配列をローカルで印刷すると機能します。

于 2012-09-28T16:34:58.187 に答える