コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: RL.cs プロジェクト: parhelia512/FreeMote
        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);
        }