private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat = PsbPixelFormat.None) { BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); int stride = bmpData.Stride; // 扫描线的宽度 int offset = stride - bmp.Width; // 显示宽度与扫描线宽度的间隙 IntPtr iptr = bmpData.Scan0; // 获取bmpData的内存起始位置 int scanBytes = stride * bmp.Height; // 用stride宽度,表示这是内存区域的大小 var result = new byte[scanBytes]; System.Runtime.InteropServices.Marshal.Copy(iptr, result, 0, scanBytes); bmp.UnlockBits(bmpData); // 解锁内存区域 switch (pixelFormat) { case PsbPixelFormat.WinRGBA4444: result = Rgba428(result, false); break; case PsbPixelFormat.CommonRGBA8: Rgba2Argb(ref result); break; case PsbPixelFormat.DXT5: //Rgba2Argb(ref result); result = DxtUtil.Dxt5Encode(result, bmp.Width, bmp.Height); break; } return(result); }
private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat = PsbPixelFormat.None) { BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); int stride = bmpData.Stride; // 扫描线的宽度 int offset = stride - bmp.Width; // 显示宽度与扫描线宽度的间隙 IntPtr iPtr = bmpData.Scan0; // 获取bmpData的内存起始位置 int scanBytes = stride * bmp.Height; // 用stride宽度,表示这是内存区域的大小 var result = new byte[scanBytes]; Marshal.Copy(iPtr, result, 0, scanBytes); bmp.UnlockBits(bmpData); // 解锁内存区域 switch (pixelFormat) { case PsbPixelFormat.LeRGBA4444: result = Argb428(result, false); break; case PsbPixelFormat.BeRGBA4444: Argb2Rgba(ref result, true); result = Argb428(result, false); break; case PsbPixelFormat.BeRGBA8: Switch_0_2(ref result); break; case PsbPixelFormat.A8L8: result = Argb2A8L8(result); break; case PsbPixelFormat.A8L8_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb2A8L8(result); break; case PsbPixelFormat.DXT5: //Switch_0_2(ref result); result = DxtUtil.Dxt5Encode(result, bmp.Width, bmp.Height); break; case PsbPixelFormat.RGBA8_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); Switch_0_2(ref result); break; case PsbPixelFormat.TileRGBA8_SW: result = PostProcessing.TileTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); break; case PsbPixelFormat.L8: result = Argb2L8(result); break; case PsbPixelFormat.A8_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb2A8(result); break; case PsbPixelFormat.TileA8_SW: result = PostProcessing.TileTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb2A8(result); break; case PsbPixelFormat.A8: result = Argb2A8(result); break; case PsbPixelFormat.CI8_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); break; case PsbPixelFormat.CI4_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); break; case PsbPixelFormat.L8_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb2L8(result); break; case PsbPixelFormat.LeRGBA4444_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb428(result, false); break; case PsbPixelFormat.RGBA5650: result = Argb2Rgba5650(result); break; case PsbPixelFormat.RGBA5650_SW: result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat); result = Argb2Rgba5650(result); break; } return(result); }