私は単純なファイル転送アプリケーションを実装しようとしています。Bluetooth経由でJavaFXとAndroidを転送する画像
私のアプリはそのように行います。 1.キャプチャ現在のカメラのプレビューをアンドロイドに 2. JavaFXのアプリがそれを保存し、ウィンドウに表示画像を受信3. 4.いくつかの後にBluetooth経由でのJavaFXアプリケーションに送ります画像の上に描画することは、再びアンドロイドに
を送って、それをキャプチャする私は、ファイルサイズ、実際のデータとEOFが含まれているパケットの種類を作成した最初の
のAndroid側でこのように実装。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
data.compress(Bitmap.CompressFormat.JPEG, 100, baos);
// filesize + data + end of file
String fileSize = String.valueOf(baos.size());
fileSize += '\0'; // end of the filesize string
String eof = "eof"; // end of packet
// set packet size
int packetSize = fileSize.length() + baos.size() + eof.length();
ByteBuffer byteBuffer = ByteBuffer.allocate(packetSize);
byteBuffer.put(fileSize.getBytes());
byteBuffer.put(baos.toByteArray());
byteBuffer.put(eof.getBytes());
byte[] data = new byte[byteBuffer.capacity()];
byteBuffer.position(0);
byteBuffer.get(data);
と
bytes = btIn.read(buffer);
// receive packet data
if (fileSize == null) {
for (int i = 0; i < bytes; i++) {
if (buffer[i] == '\0') {
fileSize = new String(buffer, 0, i);
break;
}
}
}
// eof offset
int offset = bytes - 3;
byte[] eofByte = new byte[3];
eofByte = Arrays.copyOfRange(buffer, offset, bytes);
String message = new String(eofByte, 0, 3);
if (message.equals("eof")) {
eof = true;
fos.write(buffer, 0, bytes-3);
} else {
// set buffer size to file size
if (fileBuffer == null) {
fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
fileBuffer.put(buffer, fileSize.length()+1, bytes);
fos.write(buffer, fileSize.length()+1, bytes);
} else {
fileBuffer.put(buffer, 0, bytes);
fos.write(buffer, 0, bytes);
// for progress bar
percent = (float) fileBuffer.position()/(float) fileBuffer.capacity();
}
}
log(String.valueOf(percent));
if (eof) {
byte[] data = new byte[fileBuffer.capacity()];
fileBuffer.position(0);
fileBuffer.get(data);
ByteArrayInputStream input = new ByteArrayInputStream(data);
bufferedImage = ImageIO.read(input);
image = SwingFXUtils.toFXImage(bufferedImage, null);
if (bufferedImage != null) {
log("got the image");
}
// set null fileBuffer and fileSize for next images
fileSize = null;
fileBuffer = null;
}
}
コード上に、JavaFXの側でのOutputStreamソケットを
をブルートゥースデータの送信は、Anroid
から画像をrecevingとJavaFXの上部分である送信するためのものです。
WritableImage writableImage = new WritableImage((int)canvas.getWidth(), (int)canvas.getHeight());
canvas.snapshot(null, writableImage);
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(writableImage, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(bufferedImage, "jpg", baos);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] imageInBytes = baos.toByteArray();
log(String.valueOf(imageInBytes.length));
bct.write(imageInBytes);
String eof = "end of file";
byte[] eofbyte = eof.getBytes();
bct.write(eofbyte);
送信側と受信側の一部の作業罰金... しかし、私は、Androidとあなたが見る、SS、画像の最も左側から画像を受け取ったときにこれはJavaFXの側で結果画像上の問題
を持っていますこのようにAndroidでのJavaFX側からの結果の画像を画像をreceving後
よりweired
所望されない:私の質問は正しい画像を取得するためにコードを修正する必要がありますか?
そうでした。アルファチャンネルのない画像を再保存することで修正しました。答えてくれてありがとう – kju