Come effettuo il parsing di un record di metafile PolyPolygon16 da un byte [] c #

StackOverflow https://stackoverflow.com/questions/1778938

  •  21-09-2019
  •  | 
  •  

Domanda

Ho bisogno di un po 'di aiuto nel definire il seguente tipo di Windows GDI in C #. Ho i dati sotto forma di un byte[] in C #, e ho bisogno di schierare o lanciare come il seguente in C # in qualche modo.

Questo è il tipo:

http://java.freehep.org/vectorgraphics/apidocs/org/freehep/graphicsio/emf/gdi/PolyPolygon16.html

http://msdn.microsoft.com/en-us/library/cc230665%28PROT.10%29.aspx

Edit: Sono stato in grado di arrivare a questo punto, vicino ma non del tutto:

                    UInt32 rectLeft = BitConverter.ToUInt32(dataArray, 0);
                UInt32 rectTop = BitConverter.ToUInt32(dataArray, 4);
                UInt32 rectRight = BitConverter.ToUInt32(dataArray, 8);
                UInt32 rectBottom = BitConverter.ToUInt32(dataArray, 12);
                UInt32 rectNumberOfPolygons = BitConverter.ToUInt32(dataArray, 16);
                // Number of points in each polygon
                int l_nIndex = 20;
                UInt32[] lengths = new UInt32[rectNumberOfPolygons];
                for (int i = 0; i < lengths.Length; i++)
                {
                    lengths[i] = BitConverter.ToUInt32(dataArray, l_nIndex);
                    l_nIndex += 4;
                }
                // Extract points
                foreach (int l_nPolygonLength in lengths)
                {
                    List<Point> l_lstPoints = new List<Point>();
                    for (int i = 0; i < l_nIndex + l_nPolygonLength; i++)
                    {
                        UInt16 pointX = BitConverter.ToUInt16(dataArray, l_nIndex);
                        UInt16 pointY = BitConverter.ToUInt16(dataArray, l_nIndex + 2);
                        l_lstPoints.Add(new Point((int)pointX, (int)pointY));
                        l_nIndex += 4;
                    }
                }
È stato utile?

Soluzione

RectL oggetto :

public static Rectangle ReadRectangle32(this BinaryReader reader)
{
    // Left (4 bytes)
    int left = reader.ReadInt32();

    // Top (4 bytes)
    int top = reader.ReadInt32();

    // Right (4 bytes)
    int right = reader.ReadInt32();

    // Bottom (4 bytes)
    int bottom = reader.ReadInt32();

    return Rectangle.FromLTRB(left, top, right, bottom);
}

punti di oggetto :

public static Point ReadPoint16(this BinaryReader reader)
{
    // x (2 bytes)
    int x = reader.ReadUInt16();

    // y (2 bytes)
    int y = reader.ReadUInt16();

    return new Point(x, y);
}

EMR_POLYPOLYGON16 Record (senza tipo e dimensioni):

public static PolyPolygon ReadPolyPolygon16(this BinaryReader reader)
{
    // Bounds (16 bytes)
    Rectangle bounds = reader.ReadRectangle32();

    // NumberOfPolygons (4 bytes)
    int numberOfPolygons = reader.ReadInt32();

    // Count (4 bytes)
    int count = reader.ReadInt32();

    // PolygonPointCount (variable):
    //      A NumberOfPolygons length array of 32-bit unsigned integers
    var polygonPointCount = new int[numberOfPolygons];
    for (int i = 0; i < polygonPointCount.Length; i++)
    {
        polygonPointCount[i] = reader.ReadInt32();
    }

    // aPoints (variable):
    //      A Count length array of WMF PointS objects
    var points = new Point[count];
    for (int i = 0; i < points.Length; i++)
    {
        points[i] = reader.ReadPoint16();
    }

    return new PolyPolygon(bounds, numberOfPolygons, polygonPointCount, points);
}

Utilizzo:

byte[] buffer;
using (var stream = new MemoryStream(buffer))
using (var reader = new BinaryReader(stream))
{
    var polypolygon = reader.ReadPolyPolygon16();
}

(testato)

Altri suggerimenti

Questa sembra essere la firma del metodo della funzione di Windows GDI (non un tipo). E 'secondo argomento è un puntatore a una matrice di punti, si desidera avere disegnato. Terzo argomento è un puntatore a un array di interi specificando quanti punti ci sono in ogni poligono, e l'ultimo argomento è il numero di poligoni.

Non sono riuscito a trovare una funzione di Windows GDI esattamente denominato PolyPolygon16 durante la ricerca su Google, ma ho trovato questo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top