首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX与安卓之间的蓝牙图像传输

JavaFX与安卓之间的蓝牙图像传输
EN

Stack Overflow用户
提问于 2016-04-22 07:37:10
回答 1查看 321关注 0票数 0

我正在尝试实现一个简单的文件传输应用程序。

我的应用程序是这样的: 1.在Android 2中捕捉当前的摄像机预览。通过蓝牙3将其发送到Javafx应用程序。当Javafx应用程序收到图像保存并显示在窗口4上时,在绘制完图像后再将其发送给Android。

我首先在Android端实现了这样的功能。

我创建了一个包含文件大小、实际数据和eof的包。

代码语言:javascript
复制
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);

并将数据发送到蓝牙输出流套接字。

在JavaFX方面,

代码语言:javascript
复制
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;
                }
            }

上面的代码是用于从Anroid中重新编码图像的。

在JavaFX上发送的部分是:

代码语言:javascript
复制
            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);

发送和接收部分工作正常。但我在结果图像上有问题

这是JavaFX侧,当您看到从Android和ss接收到图像时,最左边的图像是不想要的。

更多的是,在从JavaFX侧重编码图像之后,安卓系统上的结果图像如下:

我的问题是,我应该如何修复代码以获得正确的图像?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 08:22:39

我想你被这个虫子击中了:

https://bugs.openjdk.java.net/browse/JDK-8041459

您可以通过使用PNG而不是JPG来避免这个问题。另一种选择是在存储图像之前显式地将图像转换为没有alpha组件的图像。

迈克尔

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36787754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档