示例#1
0
        public WriteableBitmap GetTexture(string name, bool transparent)
        {
            if (img_cache.ContainsKey(name))
            {
                return(img_cache[name]);
            }
            Stream stream = GetStream(name + ".ddt");

            if (stream == null)
            {
                return(null);
            }
            var             img  = DDTImage.Load(stream);
            WriteableBitmap tex  = new WriteableBitmap(img.Width, img.Height, 75, 75, PixelFormats.Bgra32, null);
            var             data = img.Get32BitUncompressed();

            /*for (int d = 0; d < data.Length; d += 4) {
             *  byte r = data[d + 2];
             *  data[d + 2] = data[d + 0];
             *  data[d + 0] = r;
             * }*/
            /*if (transparent)
             * {
             *  for (int d = 0; d < data.Length; d += 4) {
             *      if (data[d + 0] == 0 && data[d + 1] == 0 && data[d + 2] == 0 && data[d + 3] == 255) {
             *          data[d + 3] = 0;
             *      }
             *  }
             * }*/
            tex.WritePixels(new Int32Rect(0, 0, img.Width, img.Height), data, img.Width * 4, 0);
            //tex.SetData(data);
            img_cache.Add(name, tex);
            return(tex);
        }
示例#2
0
        public string ConvertFileTo(FileViewModel file, string path)
        {
            try {
                switch (file.Extension.ToLower())
                {
                case ".xmb": {
                    var xdoc = XMBFile.Load(GetFileStream(file.Entry)).GetAsXDocument();
                    xdoc.Save(path);
                } break;

                case ".btx":
                case ".ddt": {
                    RTS3Image srcImg = null;
                    if (file.Extension.ToLower() == ".ddt")
                    {
                        srcImg = DDTImage.Load(GetFileStream(file.Entry));
                    }
                    else if (file.Extension.ToLower() == ".btx")
                    {
                        srcImg = BTXImage.Load(GetFileStream(file.Entry));
                    }
                    byte[] pixData = srcImg.Get32BitUncompressed();
                    if (pixData == null)
                    {
                        return(null);
                    }
                    var           bmp     = BitmapSource.Create(srcImg.Width, srcImg.Height, 96, 96, PixelFormats.Bgra32, null, pixData, srcImg.Width * 4);
                    BitmapEncoder encoder = null;
                    if (Path.GetExtension(path).ToLower() == ".png")
                    {
                        encoder = new PngBitmapEncoder();
                    }
                    else if (Path.GetExtension(path).ToLower() == ".jpg")
                    {
                        encoder = new JpegBitmapEncoder();
                    }
                    else if (Path.GetExtension(path).ToLower() == ".gif")
                    {
                        encoder = new GifBitmapEncoder();
                    }
                    else if (Path.GetExtension(path).ToLower() == ".bmp")
                    {
                        encoder = new BmpBitmapEncoder();
                    }
                    encoder.Frames.Add(BitmapFrame.Create(bmp));
                    using (var stream = File.Create(path)) {
                        encoder.Save(stream);
                    }
                } break;

                default: return(null);
                }
            } catch {
                return(null);
            }
            return(path);
        }
示例#3
0
        public void GetWPFTexture(string name, Action <ImageSource> callback)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                return;
            }
            var cache = FindInCache(name);

            if (cache != null)
            {
                callback(cache); return;
            }
            ThreadPool.QueueUserWorkItem(delegate {
                RTS3Image image = null;
                lock (imageCache) {
                    cache = FindInCache(name);
                    if (cache != null)
                    {
                        callback(cache); return;
                    }
                    var file = GetStream(name);
                    if (file == null)
                    {
                        var noext = DropExt(name);
                        if (file == null)
                        {
                            file = GetStream(noext + ".ddt");
                        }
                        if (file == null)
                        {
                            file = GetStream(noext + ".btx");
                        }
                    }
                    if (file != null)
                    {
                        var magic      = file.ReadByte();
                        file.Position -= 1;
                        if (magic == 'b')
                        {
                            try { image = BTXImage.Load(file); } catch { }
                        }
                        else
                        {
                            try { image = DDTImage.Load(file); } catch { }
                        }
                    }
                }
                if (image != null)
                {
                    var pixData = image.Get32BitUncompressed();
                    App.Current.Dispatcher.BeginInvoke((Action) delegate {
                        var bmp = BitmapSource.Create(image.Width, image.Height, 96, 96, PixelFormats.Bgra32, null, pixData, image.Width * 4);
                        lock (imageCache) {
                            if (!imageCache.ContainsKey(name))
                            {
                                imageCache.Add(name, bmp);
                            }
                        }
                        callback(bmp);
                    });
                }
                else
                {
                    App.Current.Dispatcher.BeginInvoke((Action) delegate {
                        callback(null);
                    });
                }
            });
        }