2

Eclipse Window Builder Editor を使用して GUI を作成しています。Gridlayout で Composite を作成し、そこに Label を配置しました。別のクラスの一部のメソッドは、バイト配列に保存される生の 8 ビット 1280x1024 グレースケール イメージを生成します。これは、 mainMethod で ImageData などを生成する方法です。

Color white = display.getSystemColor(SWT.COLOR_WHITE);
Color black = display.getSystemColor(SWT.COLOR_BLACK);

PaletteData palette = new PaletteData( 255, 255, 255 );

imgData = new ImageData(1280, 1024, 8, palette);

imgLabel = new Label(composite_3, SWT.NONE);
imgLabel.setImage(null);
imgLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

とにかく色は必要ないので、PaletteDataで何をすべきかを正確に理解するのにまだ問題があります。(色) 255 のグレー値が必要なため、深さは 8 にする必要がありますか?

これは、byte[] にデータが入力されるとすぐに別のスレッドから呼び出される setImg メソッドです。

public static void setImg(final byte[] b) {
    Display.getDefault().syncExec( new Runnable() {
        @Override
        public void run() {
            imgData.setPixels(0, 0, 1280, b, 0);
            img = new Image(Display.getCurrent(), imgData);
            Image grayImg = new Image(Display.getCurrent(), img, SWT.IMAGE_GRAY);
            imgLabel.setImage(img);

//              img.dispose();
        }
    });
}

私はもう試した

imgLabel.setImage(img);

imgLabel.setImage(grayImg);

最初の行が正しく表示されるようになりました... imgData.setPixels(...) で1行のピクセルしか設定できないようですが、これは役に立たないimoのようなものですか、それとも何か間違っていますか?

4

1 に答える 1

0

Your PaletteData uses the constructor for a direct palette. I guess that what You want is the constructor for an indexed palette. See also here and here for more explanation.

The following code snippet shows

  • how to create a grey scale palette using an indexed palette
  • how to set the image as a whole (not line by line)

    // pixel depth will be 8-bit, so there is space for 256 different (grey) values
    RGB[] rgb = new RGB[256];
    
    // build grey scale palette: 256 different grey values are generated. 
    for (int i = 0; i < 256; i++) {
        rgb[i] = new RGB(i, i, i);
    }
    
    // Construct a new indexed palette given an array of RGB values.
    PaletteData paletteData = new PaletteData(rgb);
    
    // create an image with given dimensions, depth and color palette
    ImageData imageData = new ImageData(1280, 1024, 8, paletteData);
    
    // data represents the pixels of the image. This corresponds to 'b' in Your code
    imageData.data = b;
    
    // note that there are also other 'Image', e.g. java.awt.Image
    org.eclipse.swt.graphics.Image image = new Image(Display.getCurrent(), imageData);
    
    // paint
    imgLabel.setImage(img);
    
    // release operating system resources corresponding to the image
    image.dispose();
    

NOTE: I tried an example with Your PaletteData, e.g.

    PaletteData palette = new PaletteData( 255, 255, 255 );

and it worked in the sense that it showed some grey scale pictures (a video actually). However, the indexed version used in given code snippet was much more eye friendly. Have a look at the first link provided above. It gives a good explanation of the difference between indexed and direct color palette.

于 2013-04-04T07:54:04.033 に答える