バイトのうち記録メタファイルどのように私はPolyPolygon16を解析します[] C#
質問
私はC#で次のWindows GDIのタイプを定義する際に少しの助けを必要としています。私はC#でbyte[]
の形式でデータを持っている、と私は何とかマーシャルにまたはC#で、次のようにキャストする必要があります。
このタイプです。
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
編集:私は近く、遠くこれを取得することができたもののていない、かなります:
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;
}
}
解決
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);
}
ポイントがのオブジェクト:
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);
}
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);
}
使用方法:
byte[] buffer;
using (var stream = new MemoryStream(buffer))
using (var reader = new BinaryReader(stream))
{
var polypolygon = reader.ReadPolyPolygon16();
}
(未テスト)
他のヒント
これはWindowsのGDI関数(ないタイプ)のメソッドのシグネチャであると思われます。それの第二引数は、点の配列へのポインタは、あなたが描かれているにしたいです。 3番目の引数が存在し、各ポリゴンにあり、最後の引数は、ポリゴンの数であり、どのように多くのポイントを指定する整数の配列へのポインタである。
私はGoogleで検索するときに、正確にPolyPolygon16という名前のWindows GDI関数を見つけることができませんでしたが、私がやったのfind <のhref = "http://msdn.microsoft.com/en-us/library/dd162818.aspx" のrel = "nofollowをnoreferrer">このを。
所属していません StackOverflow