调整WritableBitmap的大小

我已经创建了Gray16格式的WriteableBitmap。 我想将这个WriteableBitmap的大小调整为我已知的尺寸,保留像素格式(Gray16)。

是否有人在调整WriteableBitmap的大小。 请帮我。

我还搜索了互联网,发现了http://writeablebitmapex.codeplex.com/,但这是通过一个assembly引用错误。

请帮我。

您可以使用以下函数来调整writableBitmap大小:

 WriteableBitmap resize_image(WriteableBitmap img, double scale) { BitmapSource source = img; var s = new ScaleTransform(scale, scale); var res = new TransformedBitmap(img, s); return convert_BitmapSource_to_WriteableBitmap(res); } WriteableBitmap convert_BitmapSource_to_WriteableBitmap(BitmapSource source) { // Calculate stride of source int stride = source.PixelWidth * (source.Format.BitsPerPixel / 8); // Create data array to hold source pixel data byte[] data = new byte[stride * source.PixelHeight]; // Copy source image pixels to the data array source.CopyPixels(data, stride, 0); // Create WriteableBitmap to copy the pixel data to. WriteableBitmap target = new WriteableBitmap(source.PixelWidth , source.PixelHeight, source.DpiX, source.DpiY , source.Format, null); // Write the pixel data to the WriteableBitmap. target.WritePixels(new Int32Rect(0, 0 , source.PixelWidth, source.PixelHeight) , data, stride, 0); return target; } 

我编写了调整writableBitmap大小的函数。 我在我的博客上发布了代码:

http://harshaprojects.wordpress.com/2010/08/30/resize-writable-bitmap-in-wpf/

希望它会有所帮助。

码:

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Media; using System.Windows.Media.Imaging; using Microsoft.Win32; using System.IO; using System.Windows.Interop; namespace System.Windows.Media.Imaging { public static class RewritableBitmap { public static WriteableBitmap ResizeWritableBitmap(this WriteableBitmap wBitmap,int reqWidth, int reqHeight) { int Stride = wBitmap.PixelWidth * ((wBitmap.Format.BitsPerPixel + 7) / 8); int NumPixels = Stride * wBitmap.PixelHeight; ushort[] ArrayOfPixels = new ushort[NumPixels]; wBitmap.CopyPixels(ArrayOfPixels, Stride, 0); int OriWidth = (int) wBitmap.PixelWidth; int OriHeight = (int) wBitmap.PixelHeight; double nXFactor = (double)OriWidth / (double)reqWidth; double nYFactor = (double)OriHeight / (double)reqHeight; double fraction_x, fraction_y, one_minus_x, one_minus_y; int ceil_x, ceil_y, floor_x, floor_y; ushort pix1, pix2, pix3, pix4; int nStride = reqWidth * ((wBitmap.Format.BitsPerPixel + 7) / 8); int nNumPixels = reqWidth * reqHeight; ushort[] newArrayOfPixels = new ushort[nNumPixels]; /*Core Part*/ /* Code project article : Image Processing for Dummies with C# and GDI+ Part 2 - Convolution Filters By Christian Graus href= */ for (int y = 0; y < reqHeight; y++) { for (int x = 0; x < reqWidth; x++) { // Setup floor_x = (int)Math.Floor(x * nXFactor); floor_y = (int)Math.Floor(y * nYFactor); ceil_x = floor_x + 1; if (ceil_x >= OriWidth) ceil_x = floor_x; ceil_y = floor_y + 1; if (ceil_y >= OriHeight) ceil_y = floor_y; fraction_x = x * nXFactor - floor_x; fraction_y = y * nYFactor - floor_y; one_minus_x = 1.0 - fraction_x; one_minus_y = 1.0 - fraction_y; pix1 = ArrayOfPixels[floor_x + floor_y * OriWidth]; pix2 = ArrayOfPixels[ceil_x + floor_y * OriWidth]; pix3 = ArrayOfPixels[floor_x + ceil_y * OriWidth]; pix4 = ArrayOfPixels[ceil_x + ceil_y * OriWidth]; ushort g1 = (ushort)(one_minus_x * pix1 + fraction_x * pix2); ushort g2 = (ushort)(one_minus_x * pix3 + fraction_x * pix4); ushort g = (ushort)(one_minus_y * (double)(g1) + fraction_y * (double)(g2)); newArrayOfPixels[y * reqWidth + x] = g; } } /*End of Core Part*/ WriteableBitmap newWBitmap = new WriteableBitmap(reqWidth, reqHeight, 96, 96, PixelFormats.Gray16, null); Int32Rect Imagerect = new Int32Rect(0, 0, reqWidth, reqHeight); int newStride = reqWidth * ((PixelFormats.Gray16.BitsPerPixel + 7) / 8); newWBitmap.WritePixels(Imagerect, newArrayOfPixels, newStride, 0); return newWBitmap; } } }