public static STim Decode4(byte[] picbin, byte[] palbin, int tbw, int cx, int cy) { var bitmap = new Bitmap(cx, cy, PixelFormat.Format4bppIndexed); tbw /= 2; byte[] array = Reform4.Decode4(picbin, tbw, Math.Max(1, picbin.Length / 8192 / tbw)); BitmapData bitmapData = bitmap.LockBits(Rectangle.FromLTRB(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format4bppIndexed); try { int val = bitmapData.Stride * bitmapData.Height; Marshal.Copy(array, 0, bitmapData.Scan0, Math.Min(array.Length, val)); } finally { bitmap.UnlockBits(bitmapData); } ColorPalette palette = bitmap.Palette; int num = 0; for (int i = 0; i < 16; i++) { palette.Entries[i] = CUtil.NoGamma( Color.FromArgb(AcUt.GetA(palbin[num + 4 * i + 3]), palbin[num + 4 * i], palbin[num + 4 * i + 1], palbin[num + 4 * i + 2]), 0.5f); } bitmap.Palette = palette; return(new STim(bitmap)); }
public static STim Decode4(byte[] picbin, byte[] palbin, int tbw, int cx, int cy) { Bitmap pic = new Bitmap(cx, cy, global::System.Drawing.Imaging.PixelFormat.Format4bppIndexed); tbw /= 2; XDebug.Assert(tbw != 0, "Invalid"); byte[] bin = OpenKh.Kh2.Ps2.Decode4(picbin, tbw, Math.Max(1, picbin.Length / 8192 / tbw)); BitmapData bd = pic.LockBits(Rectangle.FromLTRB(0, 0, pic.Width, pic.Height), ImageLockMode.WriteOnly, global::System.Drawing.Imaging.PixelFormat.Format4bppIndexed); try { int buffSize = bd.Stride * bd.Height; global::System.Runtime.InteropServices.Marshal.Copy(bin, 0, bd.Scan0, Math.Min(bin.Length, buffSize)); } finally { pic.UnlockBits(bd); } ColorPalette pals = pic.Palette; int psi = 0; for (int pi = 0; pi < 16; pi++) { pals.Entries[pi] = CUtil.Gamma(Color.FromArgb( AcUt.GetA(palbin[psi + 4 * pi + 3]), palbin[psi + 4 * pi + 0], palbin[psi + 4 * pi + 1], palbin[psi + 4 * pi + 2] ), γ); } pic.Palette = pals; return(new STim(pic)); }
public static STim Decode8(byte[] picbin, byte[] palbin, int tbw, int cx, int cy) { var bitmap = new Bitmap(cx, cy, PixelFormat.Format8bppIndexed); tbw /= 2; byte[] array = Reform8.Decode8(picbin, tbw, Math.Max(1, picbin.Length / 8192 / tbw)); BitmapData bitmapData = bitmap.LockBits(Rectangle.FromLTRB(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); try { int val = bitmapData.Stride * bitmapData.Height; Marshal.Copy(array, 0, bitmapData.Scan0, Math.Min(array.Length, val)); } finally { bitmap.UnlockBits(bitmapData); } ColorPalette palette = bitmap.Palette; int num = 0; var array2 = new byte[1024]; for (int i = 0; i < 256; i++) { int num2 = KHcv8pal.repl(i); Array.Copy(palbin, 4 * i, array2, 4 * num2, 4); } Array.Copy(array2, 0, palbin, 0, 1024); for (int j = 0; j < 256; j++) { palette.Entries[j] = CUtil.NoGamma( Color.FromArgb(AcUt.GetA(palbin[num + 4 * j + 3]) ^ (j & 1), Math.Min(255, palbin[num + 4 * j] + 1), Math.Min(255, palbin[num + 4 * j + 1] + 1), Math.Min(255, palbin[num + 4 * j + 2] + 1)), 0.5f); } bitmap.Palette = palette; return(new STim(bitmap)); }