Estoy tratando de convertir un objeto a una imagen.

Agudo el objeto de una cámara USB3 usando lo siguiente:

object RawData = axActiveUSB1.GetImageWindow(0,0,608,608);

Esto devuelve una variante (SafeArray)

Después de revisar más, RAWDATA = {BYTE [1824, 608]}. La imagen es de 608 x 608, así que supongo que 1824 es 3 veces el tamaño debido al componente RGB de la imagen. El formato de píxel de la cámara es Bayerrgb8 y de acuerdo con la API que estoy usando el tipo de datos está representado en bytes:

Formato de pixel de cámara | Formato de salida | Tipo de datos | Dimensiones
Bayer8 | RGB de 24 bits | Byte | 0 a sizex * 3 - 1, 0 a las líneas - 1

Puedo convertirlo a una matriz de bytes usando este código encontrado en Convierta cualquier objeto a un byte [ ]

private byte[] ObjectToByteArray(Object obj)
        {
            if (obj == null)
                return null;
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            return ms.ToArray();

        }

Desde aquí, entonces hago: (todo este código también encontrado o derivado de información en pila)

// convert object to bytes
byte[] imgasbytes = ObjectToByteArray(RawData);
// create a bitmap and put data in it to go into the picturebox
var bitmap = new Bitmap(608, 608, PixelFormat.Format24bppRgb);
var bitmap_data = bitmap.LockBits(new Rectangle(0, 0,bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);

Marshal.Copy(imgasbytes, 0, bitmap_data.Scan0, imgasbytes.Length );
bitmap.UnlockBits(bitmap_data);
var result = bitmap as Image; // this line not even really necessary
PictureBox.Image = result;

El código funciona, pero debería ver esto: ingrese la descripción de la imagen aquí

Pero veo esto: ingrese la descripción de la imagen aquí

He hecho esto en Python y tuve problemas similares que pude resolver, pero no soy tan fuerte en C # y no puedo progresar desde aquí. Necesito rotar mi imagen 90 grados, pero también creo que mi problema se relaciona con la conversión incorrecta de la matriz. Creo que necesito convertir mi objeto (SafeArray) a una matriz multidimensional para que el RGB se sienta uno encima del otro. He mirado muchos ejemplos sobre cómo hacer esto, pero no entiendo cómo hacerlo.

Cualquier retroalimentación es muy apreciada por lo que estoy haciendo mal.

editar Estoy mirando esto - & gt; convertir rgb8 byte [] a bitmap

Que puede estar relacionado con mi problema.

-1
Steve Carter 14 jul. 2019 a las 04:33

1 respuesta

La mejor respuesta

Parece que el problema era exactamente como lo describí. Al final, el problema principal fue que la matriz necesitaba ser girada. Encontré una solución aquí - & gt; Rotar M * N Matrix (90 grados)

Cuando giré la imagen, resolví el problema de la imagen que estaba viendo arriba. Mientras que mi imagen está invertida ahora, entiendo el problema y como resultado, ya no veo el problema.

Aquí está el código en caso de que cualquiera se encuentre con el mismo problema.

        byte[,] newImageAsBytes = new byte[ImageAsBytes.GetLength(1), ImageAsBytes.GetLength(0)];
        int newColumn, newRow = 0;
        for (int oldColumn = ImageAsBytes.GetLength(1) - 1; oldColumn >= 0; oldColumn--)
        {
            newColumn = 0;
            for (int oldRow = 0; oldRow < ImageAsBytes.GetLength(0); oldRow++)
            {
                newImageAsBytes[newRow, newColumn] = ImageAsBytes[oldRow, oldColumn];
                newColumn++;
            }
            newRow++;
        }
        byte[] b = ObjectToByteArray(newImageAsBytes);
        var bitmap = new Bitmap(608, 608, PixelFormat.Format24bppRgb); // 608 is my image size and I am working with a camera that uses BayerRGB8
        var bitmap_data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
        Marshal.Copy(b, 0, bitmap_data.Scan0, b.Length);
        bitmap.UnlockBits(bitmap_data);
        var result = bitmap as Image; // this line not even really necessary
        PictureBox.Image = result;
0
IamSierraCharlie 14 jul. 2019 a las 13:44