private static LoadedImage LoadImageUsingDirectX(BaseRenderer renderer, byte[] imageData) { if (imageData == null || imageData.Length == 0) { return(null); } try { Format format; var pngData = TextureReader.ToPng(renderer.DeviceContextHolder, imageData, true, out format); var image = new BitmapImage(); using (var stream = new MemoryStream(pngData) { Position = 0 }) { image.BeginInit(); image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; image.CacheOption = BitmapCacheOption.OnLoad; image.UriSource = null; image.StreamSource = stream; image.EndInit(); } image.Freeze(); return(new LoadedImage { Image = image, FormatDescription = format.ToString() }); } catch (Exception e) { Logging.Warning(e); return(null); } }
public bool OverrideTextureMaps(string textureName, double reflection, double gloss, double specular) { if (Kn5 == null) { return(false); } if (_mapsBase == null) { Format format; var data = TextureReader.ToPng(DeviceContextHolder, Kn5.TexturesData[textureName], true, out format); _mapsBase = new MagickImage(data); if (_mapsBase.Width > 256 || _mapsBase.Height > 256) { _mapsBase.Resize(256, 256); } _mapsBase.AutoLevel(Channels.Red); _mapsBase.AutoLevel(Channels.Green); _mapsBase.AutoLevel(Channels.Blue); } using (var image = _mapsBase.Clone()) { image.Evaluate(Channels.Red, EvaluateOperator.Multiply, specular); image.Evaluate(Channels.Green, EvaluateOperator.Multiply, gloss); image.Evaluate(Channels.Blue, EvaluateOperator.Multiply, reflection); return(OverrideTexture(textureName, image.ToByteArray(MagickFormat.Png))); } }
public async Task SaveTextureMaps(string filename, string baseTextureName, double reflection, double gloss, double specular) { if (Kn5 == null) { return; } MagickImage image = null; await Task.Run(() => { Format format; var data = TextureReader.ToPng(DeviceContextHolder, Kn5.TexturesData[baseTextureName], true, out format); image = new MagickImage(data); image.AutoLevel(Channels.Red); image.AutoLevel(Channels.Green); image.AutoLevel(Channels.Blue); image.Evaluate(Channels.Red, EvaluateOperator.Multiply, specular); image.Evaluate(Channels.Green, EvaluateOperator.Multiply, gloss); image.Evaluate(Channels.Blue, EvaluateOperator.Multiply, reflection); }); await SaveAndDispose(filename, image); }
private static byte[] RemoveTransparencyDds(byte[] ddsImageBytes, CompressFormat?namePreferredFormat) { var format = namePreferredFormat ?? (_dxt1Mode ? CompressFormat.DXT1 : CompressFormat.RGB); var dxtMode = format == CompressFormat.DXT1 || format == CompressFormat.DXT5; if (_textureReader == null) { _textureReader = new TextureReader(); } byte[] pngImageBytes; if (_preserveGradients) { pngImageBytes = RemoveTransparencyBitmap(_textureReader.ToPng(ddsImageBytes), out var containsGradients); if (containsGradients) { switch (format) { case CompressFormat.RGB: format = CompressFormat.RGBA; break; case CompressFormat.Luminance: format = CompressFormat.LuminanceAlpha; break; case CompressFormat.RGB565: format = CompressFormat.A4R4G4B4; break; case CompressFormat.DXT1: format = CompressFormat.DXT5; break; default: throw new ArgumentOutOfRangeException(); } } } else { pngImageBytes = _textureReader.ToPng(ddsImageBytes, true); } if (pngImageBytes == null) { return(null); } using (var pngImageStream = new MemoryStream(pngImageBytes)) using (var pngImage = (Bitmap)Image.FromStream(pngImageStream)) using (var output = new MemoryStream()) { new Compressor { MipmapMaxLevel = _mipMaps ? -1 : 0, RoundMode = dxtMode ? CompressRoundMode.ToNearestMultipleOfFour : CompressRoundMode.None, Quality = _productionQuality ? CompressQuality.Production : CompressQuality.Normal, ResizeFilter = CompressResizeFilter.Mitchell, Format = format }.Process(pngImage.Width, pngImage.Height, CopySafe(pngImage), output, null, null); return(output.ToArray()); } }