static public Texture2D LoadBitmap(string imageName, int w, int h) { // // Load a bitmap image through writeablebitmap so that we can populate our device // texture // StreamResourceInfo sr = Application.GetResourceStream(new Uri(imageName, UriKind.Relative)); BitmapImage bs = new BitmapImage(); bs.SetSource(sr.Stream); var wb = new WriteableBitmap(w, h); ScaleTransform t = new ScaleTransform(); t.ScaleX = (double)w / (double)bs.PixelWidth; t.ScaleY = (double)h / (double)bs.PixelHeight; Image image = new Image(); image.Source = bs; wb.Render(image, t); wb.Invalidate(); Texture2D tex = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, wb.PixelWidth, wb.PixelHeight, false, SurfaceFormat.Color); wb.CopyTo(tex); return tex; }
private static Texture2D LoadBitmapAndMip(Stream stream) { var bs = new BitmapImage(); bs.SetSource(stream); // Get dimensions int w = bs.PixelWidth; int h = bs.PixelHeight; if ((w % 2 != 0 && w != 1) || (h % 2 != 0 && h != 1)) throw new InvalidOperationException("Bitmap must be power of 2."); // Calculate mip levels int mipLevels = 1; int maxDimension = Math.Max(w, h); while (maxDimension > 1) { mipLevels++; maxDimension /= 2; } // Create the chain Texture2D tex = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, w, h, true, SurfaceFormat.Color); // Put bitmap into a renderable image Image image = new Image(); image.Source = bs; // Generate mip level data for (int level = 0; level < mipLevels; level++) { var wb = new WriteableBitmap(w, h); // Scale to current mip level ScaleTransform t = new ScaleTransform(); t.ScaleX = (double)w / (double)bs.PixelWidth; t.ScaleY = (double)h / (double)bs.PixelHeight; // Black out the image for (int c = 0; c < w * h; c++) wb.Pixels[c] = 0; // Small mip levels are rendering as white, so don't render if (w > 1 && h > 1) wb.Render(image, t); // Update WB wb.Invalidate(); // Grab pixel data wb.CopyTo(tex, level, null, 0, 0); // Shrink for the next level if (w != 1) w /= 2; if (h != 1) h /= 2; } return tex; }