SWT: Bild in Form eines Bytearrays im Canvas anzeigen

Hathor

Grünschnabel
Hallo, habe folgendes Problem:

Aus einer Funktion getPicture() bekomme ich ein Bild in Form eines Bytearrays byte[] x zurück und möchte dieses direkt auf einem Canvas anzeigen ohne es vorher speichern zu müssen. Habe bereits in der Java (SWT) API gestöbert und geguckt, ob man vielleicht anstatt eines Dateipfades des gespeicherten Bildes auch das Bild in Form eines Arrays an die Klasse Image übergeben kann.

Hatte mir folgendes vorgestellt: statt Image(Device device, String filename) sowas wie Image(Device device, byte[] x) .
Leider gibt es sowas nicht und ich habe bis jetzt auch nichts anderes gefunden, was mir irgendwie weiterhilft!

Gibt es da eine Möglichkeit?

Vielen Dank für die Hilfe
 
Hallo!

Schau mal hier:

Code:
/*
 * Created on 27.12.2004
 */
package de.tutorials;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * @author Administrator
 * 
 */
public class ByteArrayGFX {

	private Display display;

	private Canvas canvas;

	private final static int W = 320;

	private final static int H = 240;

	private byte[] data = new byte[W * H];

	private final static Random RND = new Random();

	public ByteArrayGFX() {

		for (int i = 0; i < data.length; i++) {
			data[i] = (byte) RND.nextInt(255);
		}
	}

	public static void main(String[] args) {
		new ByteArrayGFX().run();

	}

	private void shuffleImageData(byte[] A) {
		/**
		 * http://www.javacoffeebreak.com/books/extracts/javanotesv3/c8/s4.html
		 */
		for (int lastPlace = A.length - 1; lastPlace > 0; lastPlace--) {
			// Choose a random location from among 0,1,...,lastPlace.
			int randLoc = (int) (Math.random() * (lastPlace + 1));
			// Swap items in locations randLoc and lastPlace.
			byte temp = (byte) A[randLoc];
			A[randLoc] = A[lastPlace];
			A[lastPlace] = temp;
		}

	}

	/**
	 * 
	 */
	private void run() {
		display = new Display();
		Shell shell = new Shell(display);

		canvas = new Canvas(shell, SWT.NONE);
		canvas.setSize(W, H);
		shell.pack();
		shell.setText("ByteArrayGFX");
		shell.open();

		final ImageData imageData = new ImageData(W, H, 8, new PaletteData(
				new RGB[] { new RGB(255, 0, 0), new RGB(0, 255, 0),
						new RGB(0, 0, 255) }), 1, data);
		final GC gc = new GC(canvas);

		final Runnable r = new Runnable() {
			public void run() {
				if (!display.isDisposed()) {
				shuffleImageData(imageData.data);
					Image img = new Image(display, imageData);
					if (!canvas.isDisposed())
						gc.drawImage(img, 0, 0);
					img.dispose();
				}
			}
		};

		TimerTask task = new TimerTask() {
			public void run() {
				display.asyncExec(r);
			}
		};

		Timer timer = new Timer();
		timer.schedule(task, 200L,50L);

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		timer.cancel();
	}
}

Gruß Tom
 
Hallo Tom,

danke für deine Hilfe, werde das gleich mal ausprobieren und hoffe, dass alles klappt!

Danke, Hathor
 
Hallo Tom,

habe es ausprobiert und bin auf folgendes Problem gestoßen:
Code:
final ImageData imageData = new ImageData(W, H, 8, new PaletteData(new RGB[] { new RGB(255, 0, 0), new RGB(0, 255, 0),new RGB(0, 0, 255) }), 1, data);

Bei deinem Beispiel handelt es sich um ein Farbbild, oder? Die Bilder, die ich benutze liegen in Graustufen vor.

Bei mir wird nun lediglich ein rotes "Bild" angezeigt. Hat das mit den angegebenen RGB-Werten zu tun und wenn ja kann man hier auch irgendwie mit Graustufen arbeiten?

MfG
Hathor
 
Zurück