OSDN Git Service

ライブビューデータを拾うために検討中。その5。
authorMRSa <mrsa@myad.jp>
Mon, 6 May 2019 00:20:37 +0000 (09:20 +0900)
committerMRSa <mrsa@myad.jp>
Mon, 6 May 2019 00:20:37 +0000 (09:20 +0900)
app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/Communication.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/ReceivedDataHolder.java

index fbc1879..d4ba5f4 100644 (file)
@@ -18,10 +18,18 @@ import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
 
 import androidx.annotation.NonNull;
 
+import org.opencv.core.Mat;
+import org.opencv.imgcodecs.Imgcodecs;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FileWriter;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+import static org.opencv.core.CvType.CV_8UC1;
+import static org.opencv.imgcodecs.Imgcodecs.IMREAD_COLOR;
 
 public class CamTest implements View.OnClickListener, ILiveViewImage
 {
@@ -160,6 +168,8 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
             outputFile(receivedData);
 
             ///////  Bitmap画像を作る... //////
+            final Bitmap imageData = getBitmap(receivedData);
+/*
             final Bitmap imageData = BitmapFactory.decodeByteArray(dataValue, 18, (dataValue.length - 18));
             if (imageData == null)
             {
@@ -169,7 +179,7 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
             {
                 Log.v(TAG, "imageData : " + imageData.getByteCount() + " bytes.");
             }
-
+*/
             //////  画像を更新する
             activity.runOnUiThread(new Runnable() {
                 @Override
@@ -331,4 +341,29 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
             e.printStackTrace();
         }
     }
+
+    private Bitmap getBitmap(ReceivedDataHolder receivedData)
+    {
+        Bitmap bitmap;
+        try {
+            final ByteBuffer dataValue = receivedData.getByteBuffer();
+            final int dataLength = receivedData.getLength();
+//            final byte[] imageBytes = Arrays.copyOfRange(dataValue, 18, dataValue.length);
+
+            // OpenCVのデータ型に変換
+            Mat rawData = new Mat( 1,dataLength, CV_8UC1, dataValue);
+            Mat decodedImage = Imgcodecs.imdecode(rawData, IMREAD_COLOR);
+            bitmap = Bitmap.createBitmap(decodedImage.width(), decodedImage.height(), Bitmap.Config.ARGB_8888);
+            //org.opencv.android.Utils.matToBitmap(decodedImage, bitmap);
+
+            rawData.release();
+            decodedImage.release();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            bitmap = null;
+        }
+        return (bitmap);
+    }
 }
index 0591dfe..bbdde11 100644 (file)
@@ -6,13 +6,14 @@ import androidx.annotation.NonNull;
 
 import java.io.BufferedReader;
 import java.io.DataOutputStream;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.Socket;
 
 class Communication
 {
     private final String TAG = toString();
-    private static final int BUFFER_SIZE = 131072 + 4;
+    private static final int BUFFER_SIZE = 1024 * 1024 + 8;
 
     private static final int CONTROL_PORT = 55740;
     private static final int ASYNC_RESPONSE_PORT = 55741;
@@ -110,6 +111,7 @@ class Communication
 
     ReceivedDataHolder receive_from_camera()
     {
+/*
         InputStreamReader isr;
         char[] char_array = new char[BUFFER_SIZE];
         try
@@ -125,6 +127,23 @@ class Communication
             e.printStackTrace();
         }
         return (new ReceivedDataHolder(char_array, 0));
+*/
+        try
+        {
+            byte[] byte_array = new byte[BUFFER_SIZE];
+            InputStream is = socket.getInputStream();
+            if (is != null)
+            {
+                int read_bytes = is.read(byte_array, 0, BUFFER_SIZE);
+                Log.v(TAG, "receive_from_camera() : " + read_bytes + " bytes.");
+                return (new ReceivedDataHolder(byte_array, read_bytes));
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (new ReceivedDataHolder(new byte[0], 0));
     }
 
     private void dump_bytes(String header, byte[] data)
index 4e119d1..e28f0eb 100644 (file)
@@ -12,8 +12,9 @@ import java.util.Arrays;
 public class ReceivedDataHolder
 {
     private final byte[] data;
+    private static final int DATA_OFFSET = 18;
 
-    public ReceivedDataHolder(byte[] data, int length)
+    ReceivedDataHolder(byte[] data, int length)
     {
         this.data = Arrays.copyOfRange(data, 0, length);
      }
@@ -35,6 +36,18 @@ public class ReceivedDataHolder
         return (data);
     }
 
+    public ByteBuffer getByteBuffer()
+    {
+        ByteBuffer dataBuffer = ByteBuffer.allocateDirect(data.length - DATA_OFFSET);
+        dataBuffer.put(Arrays.copyOfRange(data, DATA_OFFSET, (data.length - DATA_OFFSET)));
+        return (dataBuffer);
+    }
+
+    public int getLength()
+    {
+        return (data.length - DATA_OFFSET);
+    }
+
     /**
      *   char[]からbyte[]に変換する
      *    (https://stackoverflow.com/questions/5513144/converting-char-to-byte より)