/// <summary> /// /// </summary> /// <param name=""></param> private void SetTOBJs(HSD_TOBJ[] tobjs) { if (TOBJ != null) { TOBJ._s.References.Clear(); foreach (var r in tobjs[0]._s.References) { TOBJ._s.References.Add(r.Key, r.Value); } TOBJ._s.SetData(tobjs[0]._s.GetData()); } if (TexAnim != null) { var imgs = new List <HSD_TexBuffer>(); var pals = new List <HSD_TlutBuffer>(); foreach (var tobj in tobjs) { HSD_TexBuffer buf = new HSD_TexBuffer(); buf.Data = tobj.ImageData; imgs.Add(buf); if (ImageDataFormat.IsPalettedFormat(tobj.ImageData.Format)) { HSD_TlutBuffer palbuf = new HSD_TlutBuffer(); palbuf.Data = tobj.TlutData; pals.Add(palbuf); } } // convert tobjs into proper strip var ib = new HSDArrayAccessor <HSD_TexBuffer>(); ib.Array = imgs.ToArray(); TexAnim.ImageBuffers = ib; if (tobjs.Length > 0 && ImageDataFormat.IsPalettedFormat(tobjs[0].ImageData.Format)) { var tb = new HSDRaw.HSDArrayAccessor <HSD_TlutBuffer>(); tb.Array = pals.ToArray(); TexAnim.TlutBuffers = tb; } else { TexAnim.TlutBuffers = null; } } if (TEXG != null) { TEXG.SetFromTOBJs(tobjs); Node.Refresh(); } }
/// <summary> /// 将Base64字符串转换为图片 /// </summary> /// <param name="base64">字串</param> /// <param name="format"></param> /// <param name="width">如果是RAW格式,需要填入宽高</param> /// <param name="height">如果是RAW格式,需要填入宽高</param> /// <returns>图片</returns> public static Image Base64ToImg(this string base64, ImageDataFormat format = ImageDataFormat.FILE, int width = 0, int height = 0) { var heads = new string[] { "png", "jgp", "jpg", "jpeg" }; foreach (var head in heads) { base64 = base64.Replace($"data:image/{head};base64,", ""); } var bytes = Convert.FromBase64String(base64); return(bytes.ToImage(format, width, height)); }
//Legacy Methods public void set_image_dim_ordering(ImageDimOrder dim_ordering) { if (dim_ordering == ImageDimOrder.th) { _IMAGE_DATA_FORMAT = ImageDataFormat.channels_first; } else if (dim_ordering == ImageDimOrder.tf) { _IMAGE_DATA_FORMAT = ImageDataFormat.channels_last; } else { throw new Exception("Unknown dim_ordering:" + dim_ordering); } }
private void cbFormat_SelectedIndexChanged(object sender, EventArgs e) { sbPalFormat.Enabled = ImageDataFormat.IsPalettedFormat(TextureFormat); propertyGrid1.SelectedObject = null; if (TextureFormat == GXTexFmt.IA4 || TextureFormat == GXTexFmt.IA8) { propertyGrid1.SelectedObject = IASettings; } if (TextureFormat == GXTexFmt.I8 || TextureFormat == GXTexFmt.I4) { propertyGrid1.SelectedObject = ISettings; } }
public void set_image_data_format(ImageDataFormat data_format) => _IMAGE_DATA_FORMAT = data_format;
private void importFramesToolStripMenuItem_Click(object sender, EventArgs e) { if (TexAnim == null) { return; } var files = Tools.FileIO.OpenFiles(ApplicationSettings.ImageFileFilter); if (files != null) { using (TextureImportDialog td = new TextureImportDialog()) { if (td.ShowDialog() == DialogResult.OK) { var matched = new HashSet <int>(); var tobjs = new List <HSD_TexBuffer>(); var pals = new List <HSD_TlutBuffer>(); foreach (var f in files) { int num = 0; int.TryParse(Regex.Match(Path.GetFileName(f).ToLower(), @"(?<=.*_)(\d+?)(?=\.)").Name, out num); Console.WriteLine(num + " " + Regex.Match(Path.GetFileName(f).ToLower(), @"(?<=.*_)(\d+?)(?=\.)").Groups[0].Value); if (!int.TryParse(Regex.Match(Path.GetFileName(f).ToLower(), @"(?<=.*_)(\d+?)(?=\.)").Groups[0].Value, out num) || matched.Contains(num)) { throw new InvalidDataException(num + " " + Path.GetFileName(f) + " is missing index tag or has duplicate index"); } else { HSD_TOBJ temp = new HSD_TOBJ(); TOBJConverter.InjectBitmap(f, temp, td.TextureFormat, td.PaletteFormat); HSD_TexBuffer buf = new HSD_TexBuffer(); buf.Data = temp.ImageData; tobjs.Add(buf); if (ImageDataFormat.IsPalettedFormat(td.TextureFormat)) { HSD_TlutBuffer palbuf = new HSD_TlutBuffer(); palbuf.Data = temp.TlutData; pals.Add(palbuf); } matched.Add(num); } } // convert tobjs into proper strip var ib = new HSDArrayAccessor <HSD_TexBuffer>(); ib.Array = tobjs.ToArray(); TexAnim.ImageBuffers = ib; if (ImageDataFormat.IsPalettedFormat(td.TextureFormat)) { var tb = new HSDRaw.HSDArrayAccessor <HSD_TlutBuffer>(); tb.Array = pals.ToArray(); TexAnim.TlutBuffers = tb; if (TexAnim?.AnimationObject?.FObjDesc?.List.Count < 2) { TexAnim.AnimationObject.FObjDesc.Next = new HSD_FOBJDesc(); TexAnim.AnimationObject.FObjDesc.Next.FromFOBJ(new HSD_FOBJ() { JointTrackType = JointTrackType.HSD_A_J_SCAX, Buffer = new byte[0] }); } } else { TexAnim.TlutBuffers = null; if (TexAnim?.AnimationObject?.FObjDesc?.List.Count > 1) { TexAnim.AnimationObject.FObjDesc.Next = null; } } Node = Node; } } } }
public static extern bool TexImage(int width, int height, int depth, byte bpp, ImageDataFormat format, ImageDataType type, byte[] data);
public static extern bool ConvertImage(ImageDataFormat destFormat, ImageDataType destType);
/// <summary> /// Byte数组转Image /// </summary> /// <param name="data"></param> /// <param name="format">如果数据格式为常见文件格式(JPG,BMP,PNG,...)无需改此参数,会自动识别.</param> /// <param name="width"></param> /// <param name="height"></param> /// <returns></returns> public static Bitmap ToImage(this byte[] data, ImageDataFormat format = ImageDataFormat.FILE, int width = 0, int height = 0) { if (data == null) { return(null); } Bitmap img = null; switch (format) { case ImageDataFormat.GIF: case ImageDataFormat.FILE: { using (var ms = new MemoryStream(data)) using (var tmp = Bitmap.FromStream(ms)) img = (Bitmap)tmp.DeepCopyBitmap(); break; } case ImageDataFormat.RAW_RGB24: { img = new Bitmap(width, height, PixelFormat.Format32bppPArgb); var imglocker = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); var bgrabuff = new byte[img.Width * img.Height * 4]; for (int i = 0; i < img.Width * img.Height; i++) { bgrabuff[i * 4 + 0] = data[i * 3 + 2]; bgrabuff[i * 4 + 1] = data[i * 3 + 1]; bgrabuff[i * 4 + 2] = data[i * 3 + 0]; bgrabuff[i * 4 + 3] = 0xFF; } Marshal.Copy(bgrabuff, 0, imglocker.Scan0, bgrabuff.Length); img.UnlockBits(imglocker); break; } case ImageDataFormat.RAW_ARGB32: { img = new Bitmap(width, height, PixelFormat.Format32bppPArgb); var imglocker = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); var bgrabuff = new byte[img.Width * img.Height * 4]; for (int i = 0; i < img.Width * img.Height; i++) { bgrabuff[i * 4 + 0] = data[i * 4 + 3]; bgrabuff[i * 4 + 1] = data[i * 4 + 2]; bgrabuff[i * 4 + 2] = data[i * 4 + 1]; bgrabuff[i * 4 + 3] = data[i * 4 + 0]; } Marshal.Copy(bgrabuff, 0, imglocker.Scan0, bgrabuff.Length); img.UnlockBits(imglocker); break; } case ImageDataFormat.RAW_BGR24: { img = new Bitmap(width, height, PixelFormat.Format32bppPArgb); var imglocker = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); var bgrabuff = new byte[img.Width * img.Height * 4]; for (int i = 0; i < img.Width * img.Height; i++) { bgrabuff[i * 4 + 0] = data[i * 3 + 0]; bgrabuff[i * 4 + 1] = data[i * 3 + 1]; bgrabuff[i * 4 + 2] = data[i * 3 + 2]; bgrabuff[i * 4 + 3] = 0xFF; } Marshal.Copy(bgrabuff, 0, imglocker.Scan0, bgrabuff.Length); img.UnlockBits(imglocker); break; } case ImageDataFormat.RAW_RGBA32: { img = new Bitmap(width, height, PixelFormat.Format32bppPArgb); var imglocker = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); var bgrabuff = new byte[img.Width * img.Height * 4]; for (int i = 0; i < img.Width * img.Height; i++) { bgrabuff[i * 4 + 0] = data[i * 4 + 2]; bgrabuff[i * 4 + 1] = data[i * 4 + 1]; bgrabuff[i * 4 + 2] = data[i * 4 + 0]; bgrabuff[i * 4 + 3] = data[i * 4 + 3]; } Marshal.Copy(bgrabuff, 0, imglocker.Scan0, bgrabuff.Length); img.UnlockBits(imglocker); break; } default: break; } return(img); }
/// <summary> /// 图片转byte数组 /// </summary> /// <param name="img"></param> /// <param name="format">如果为FILE,以fileformat决定格式</param> /// <param name="fileformat">默认为JPG格式</param> /// <returns></returns> public static byte[] ImgToBytes(this Bitmap img, ImageDataFormat format = ImageDataFormat.FILE, ImageFormat fileformat = null) { byte[] buff = null; switch (format) { case ImageDataFormat.FILE: { using (var ms = new MemoryStream()) { img.Save(ms, fileformat == null ? System.Drawing.Imaging.ImageFormat.Jpeg : fileformat); buff = ms.ToArray(); } break; } case ImageDataFormat.RAW_RGB24: { buff = new byte[img.Width * img.Height * 3]; var bgrabuff = new byte[img.Width * img.Height * 4]; var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data.Scan0, bgrabuff, 0, bgrabuff.Length); img.UnlockBits(data); for (int i = 0; i < img.Width * img.Height; i++) { buff[i * 3 + 0] = bgrabuff[i * 4 + 2]; buff[i * 3 + 1] = bgrabuff[i * 4 + 1]; buff[i * 3 + 2] = bgrabuff[i * 4 + 0]; } break; } case ImageDataFormat.RAW_ARGB32: { buff = new byte[img.Width * img.Height * 4]; var bgrabuff = new byte[img.Width * img.Height * 4]; var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data.Scan0, bgrabuff, 0, bgrabuff.Length); img.UnlockBits(data); for (int i = 0; i < img.Width * img.Height; i++) { buff[i * 4 + 0] = bgrabuff[i * 4 + 3]; buff[i * 4 + 1] = bgrabuff[i * 4 + 2]; buff[i * 4 + 2] = bgrabuff[i * 4 + 1]; buff[i * 4 + 3] = bgrabuff[i * 4 + 0]; } break; } case ImageDataFormat.RAW_BGR24: { buff = new byte[img.Width * img.Height * 3]; var bgrabuff = new byte[img.Width * img.Height * 4]; var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data.Scan0, bgrabuff, 0, bgrabuff.Length); img.UnlockBits(data); for (int i = 0; i < img.Width * img.Height; i++) { buff[i * 3 + 0] = bgrabuff[i * 4 + 0]; buff[i * 3 + 1] = bgrabuff[i * 4 + 1]; buff[i * 3 + 2] = bgrabuff[i * 4 + 2]; } break; } case ImageDataFormat.RAW_RGBA32: { buff = new byte[img.Width * img.Height * 4]; var bgrabuff = new byte[img.Width * img.Height * 4]; var data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data.Scan0, bgrabuff, 0, bgrabuff.Length); img.UnlockBits(data); for (int i = 0; i < img.Width * img.Height; i++) { buff[i * 4 + 0] = bgrabuff[i * 4 + 2]; buff[i * 4 + 1] = bgrabuff[i * 4 + 1]; buff[i * 4 + 2] = bgrabuff[i * 4 + 0]; buff[i * 4 + 3] = bgrabuff[i * 4 + 3]; } break; } case ImageDataFormat.GIF: { using (var ms = new MemoryStream()) { var gif = new Bitmap(img.Width, img.Height); foreach (var guid in img.FrameDimensionsList) { int pagenum = img.GetFrameCount(new FrameDimension(guid)); //总帧数 img.SelectActiveFrame(FrameDimension.Time, 0); gif.Edit((g) => g.DrawImage(img, 0, 0)); foreach (var p in img.PropertyItems) { gif.SetPropertyItem(p); } gif.Save(ms, GifInfo, MultiFrameEps); //枚举每一帧 for (int i = 1; i < pagenum; i++) { img.SelectActiveFrame(FrameDimension.Time, i); gif.SaveAdd(img, FrameDimensionTimeEps); //如果是GIF这里设置为FrameDimensionTime,如果为TIFF则设置为FrameDimensionPage } } //结束帧 gif.SaveAdd(FlushEps); gif.Dispose(); buff = ms.ToArray(); } break; } default: break; } return(buff); }
/// <summary> /// 图片转byte数组 /// </summary> /// <param name="img"></param> /// <param name="format">如果为FILE,以fileformat决定格式</param> /// <param name="fileformat">默认为JPG格式</param> /// <returns></returns> public static byte[] ImgToBytes(this Image img, ImageDataFormat format = ImageDataFormat.FILE, ImageFormat fileformat = null) => ImgToBytes((Bitmap)img, format, fileformat);
/// <summary> /// 图片转base64字符串 /// </summary> /// <param name="img"></param> /// <param name="format">如果为FILE,以fileformat决定格式</param> /// <param name="fileformat">默认为JPG格式</param> /// <returns></returns> public static string ImgToBase64(this Image img, ImageDataFormat format = ImageDataFormat.FILE, ImageFormat fileformat = null) => Convert.ToBase64String(img.ImgToBytes(format, fileformat));
public IImage ToBitmap() { ImageDataFormat imageDataFormat = (ImageDataFormat)null; switch ((byte)this.Header.Format) { case 0: imageDataFormat = ImageDataFormat.I4; break; case 1: imageDataFormat = ImageDataFormat.I8; break; case 2: imageDataFormat = ImageDataFormat.IA4; break; case 3: imageDataFormat = ImageDataFormat.IA8; break; case 4: imageDataFormat = ImageDataFormat.RGB565; break; case 5: imageDataFormat = ImageDataFormat.RGB5A3; break; case 6: imageDataFormat = ImageDataFormat.Rgba32; break; case 14: imageDataFormat = ImageDataFormat.Cmpr; break; } byte[] numArray = imageDataFormat.ConvertFrom( this.Data, (int)this.Header.Width, (int)this.Header.Height, (ProgressChangedEventHandler)null); var width = this.Header.Width; var height = this.Header.Height; var bitmap = new Rgba32Image(width, height); bitmap.Mutate((_, setHandler) => { for (var y = 0; y < height; ++y) { for (var x = 0; x < width; ++x) { var i = 4 * (y * width + x); var b = numArray[i + 0]; var g = numArray[i + 1]; var r = numArray[i + 2]; var a = numArray[i + 3]; setHandler(x, y, r, g, b, a); } } }); return(bitmap); }