/// <summary> /// Сохранение скриншота из буффера библиотеки в локальный битмап /// </summary> /// <param name="bitmap"></param> public void AssignBitmapFromBytes(byte[] bitmap) { using (MemoryStream s = new MemoryStream(bitmap)) { using (BinaryReader br = new BinaryReader(s)) { tagBITMAPFILEHEADER bmpFileHeader = new tagBITMAPFILEHEADER(); bmpFileHeader.bfType = br.ReadUInt16(); bmpFileHeader.bfSize = br.ReadUInt32(); bmpFileHeader.bfReserved1 = br.ReadUInt16(); bmpFileHeader.bfReserved2 = br.ReadUInt16(); bmpFileHeader.bfOffBits = br.ReadUInt32(); tagBITMAPINFOHEADER bmpInfoHeader = new tagBITMAPINFOHEADER(); bmpInfoHeader.bV5Size = br.ReadUInt32(); bmpInfoHeader.bV5Width = br.ReadInt32(); bmpInfoHeader.bV5Height = br.ReadInt32(); bmpInfoHeader.bV5Planes = br.ReadUInt16(); bmpInfoHeader.bV5BitCount = br.ReadUInt16(); bmpInfoHeader.bV5Compression = br.ReadUInt32(); bmpInfoHeader.bV5SizeImage = br.ReadUInt32(); bmpInfoHeader.bV5XPelsPerMeter = br.ReadInt32(); bmpInfoHeader.bV5YPelsPerMeter = br.ReadInt32(); bmpInfoHeader.bV5ClrUsed = br.ReadUInt32(); bmpInfoHeader.bV5ClrImportant = br.ReadUInt32(); if ( Screenshot.Width != bmpInfoHeader.bV5Width || Screenshot.Height != bmpInfoHeader.bV5Height ) { Screenshot = new Bitmap(bmpInfoHeader.bV5Width, bmpInfoHeader.bV5Height, PixelFormat.Format24bppRgb); } int px_size = (int)(bmpFileHeader.bfSize - bmpFileHeader.bfOffBits) / (bmpInfoHeader.bV5Width * bmpInfoHeader.bV5Height); Color pc; UInt16 pcs16; UInt32 pcs32; byte a, r, g, b; using (BitmapDecorator bd = new BitmapDecorator(Screenshot)) { for (int y = 0; y < bmpInfoHeader.bV5Height; ++y) { for (int x = 0; x < bmpInfoHeader.bV5Width; ++x) { switch (px_size) { case 2: // 16 bit pcs16 = br.ReadUInt16(); //byte r = (byte) (c << 10); //byte g = (byte) (c << 5); //byte b = (byte) c; r = (byte)((pcs16 & 0xf800) >> 11); g = (byte)((pcs16 & 0x07e0) >> 5); b = (byte)(pcs16 & 0x001f); r = (byte)(r << 3); g = (byte)(g << 2); b = (byte)(b << 3); pc = Color.FromArgb(r, g, b); break; case 4: // 32 bit pcs32 = br.ReadUInt32(); //byte r = (byte) (c << 10); //byte g = (byte) (c << 5); //byte b = (byte) c; a = (byte)(pcs32 >> 24); r = (byte)(pcs32 >> 16); g = (byte)(pcs32 >> 8); b = (byte)pcs32; pc = Color.FromArgb(a, r, g, b); break; default: pc = Color.Black; break; } bd.SetPixel( x, bmpInfoHeader.bV5Height - y - 1, pc ); } } } } } }