public static void SaveSnap(string fileName, Support.CBlobObject[] dataArray) { var xnd = EngineNS.IO.XndHolder.NewXNDHolder(); EngineNS.IO.XndNode node = xnd.Node; for (int k = 0; k < dataArray.Length; k++) { var data = dataArray[k]; var attr = node.AddAttrib($"Frame{k}"); unsafe { var dataPtr = (byte *)data.Data.ToPointer(); PixelDesc *desc = (PixelDesc *)dataPtr; var descSize = sizeof(PixelDesc); var srcBytes = data.ToBytes(); var tagBytes = new byte[srcBytes.Length - descSize]; for (int i = 0; i < tagBytes.Length; i += 4) { // bgra rgba tagBytes[i] = srcBytes[i + 2 + descSize]; tagBytes[i + 1] = srcBytes[i + 1 + descSize]; tagBytes[i + 2] = srcBytes[i + descSize]; tagBytes[i + 3] = srcBytes[i + 3 + descSize]; } fixed(byte *tagData = &tagBytes[0]) { var bitmap = new System.Drawing.Bitmap(desc->Width, desc->Height, desc->Stride, System.Drawing.Imaging.PixelFormat.Format32bppArgb, (IntPtr)tagData); var memStream = new System.IO.MemoryStream(); bitmap.Save(memStream, System.Drawing.Imaging.ImageFormat.Png); attr.BeginWrite(); var memArray = memStream.ToArray(); attr.Write(memArray, memArray.Length); attr.EndWrite(); } } } var tmp = fileName + ".tmp"; EngineNS.IO.XndHolder.SaveXND(tmp, xnd); CEngine.Instance.FileManager.MoveFile(tmp, fileName); }
public bool Save2File4x4(string fileName, Support.CBlobObject[] dataArray, EIMAGE_FILE_FORMAT format) { unsafe { var data = dataArray[0]; var dataPtr = (byte *)data.Data.ToPointer(); PixelDesc *desc = (PixelDesc *)dataPtr; var descSize = sizeof(PixelDesc); int imageW = desc->Width * 4; int imageH = desc->Height * 4; int imageStride = imageW * 4; var tagBytes = new byte[imageW * imageH * 4]; for (int k = 0; k < 16; k++) { data = dataArray[k]; dataPtr = (byte *)data.Data.ToPointer(); int x = k % 4; int y = k / 4; var srcBytes = data.ToBytes(); int startX = x * desc->Stride; for (int i = 0; i < desc->Height; i++) { int startY = (y * desc->Height + i) * imageStride; for (int j = 0; j < desc->Width; j++) { tagBytes[startY + startX + j * 4 + 0] = srcBytes[descSize + (i * desc->Width + j) * 4 + 2]; tagBytes[startY + startX + j * 4 + 1] = srcBytes[descSize + (i * desc->Width + j) * 4 + 1]; tagBytes[startY + startX + j * 4 + 2] = srcBytes[descSize + (i * desc->Width + j) * 4 + 0]; tagBytes[startY + startX + j * 4 + 3] = srcBytes[descSize + (i * desc->Width + j) * 4 + 3]; } //// bgra rgba //tagBytes[i] = srcBytes[i + 2 + descSize]; //tagBytes[i + 1] = srcBytes[i + 1 + descSize]; //tagBytes[i + 2] = srcBytes[i + descSize]; //tagBytes[i + 3] = srcBytes[i + 3 + descSize]; } } return(Save2File(fileName, desc->Width * 4, desc->Height * 4, desc->Stride * 4, tagBytes, format)); } }
public bool Save2File(string fileName, Support.CBlobObject data, EIMAGE_FILE_FORMAT format) { unsafe { var dataPtr = (byte *)data.Data.ToPointer(); PixelDesc *desc = (PixelDesc *)dataPtr; var descSize = sizeof(PixelDesc); var srcBytes = data.ToBytes(); var tagBytes = new byte[srcBytes.Length - descSize]; for (int i = 0; i < tagBytes.Length; i += 4) { // bgra rgba tagBytes[i] = srcBytes[i + 2 + descSize]; tagBytes[i + 1] = srcBytes[i + 1 + descSize]; tagBytes[i + 2] = srcBytes[i + descSize]; tagBytes[i + 3] = srcBytes[i + 3 + descSize]; } return(Save2File(fileName, desc->Width, desc->Height, desc->Stride, tagBytes, format)); } }