2012-12-06 28 views
0

我正在编辑一个编辑图标项目,我需要加载一个图标。我使用下面的代码来保存这个图标:如何从BitmapImage获取数组System.Windows.Media.Color?

 var sd = new SaveFileDialog(); 
     sd.ShowDialog(); 
     sd.Filter = "File *.ico|*.ico"; 
     sd.FilterIndex = 0; 
     var path = sd.FileName; 
     if (!sd.CheckPathExists) return; 

     var w = new WriteableBitmap(Dimention, Dimention, 1, 1, PixelFormats.Pbgra32, null); 
     var pix = new int[Dimention,Dimention]; 
     for (int i = 0; i < Dimention; i++) 
      for (int j = 0; j < Dimention; j++) 
       pix[i, j] = ToArgb(IconCanvas.Board[i, j].Background.Color); 

     w.WritePixels(new Int32Rect(0, 0, Dimention, Dimention), pix, Dimention*4, 0, 0); 
     var e = new BmpBitmapEncoder(); 
     e.Frames.Add(BitmapFrame.Create(w)); 
     var file = new FileStream(path, FileMode.Create); 
     e.Save(file); 
     file.Close(); 

所以,我需要从这些图像中获取一个Color [,]保存。我假设图标的大小是一个正方形(宽度=高度)。谢谢你的帮助。

+0

我找到了解决方案。 – dayanruben

回答

0

下面的代码是(使用位图)我的问题的解决方案:

// get the BitmapImage 
var image = new BitmapImage(new Uri(path)); 
if (image.PixelHeight != image.PixelWidth) return; 
Dimension = image.PixelHeight; 

// copy to byte array 
int stride = image.PixelWidth * 4; 
byte[] buffer = new byte[stride * image.PixelHeight]; 
image.CopyPixels(buffer, stride, 0); 

// create a bitmap 
var bitmap = new System.Drawing.Bitmap(image.PixelWidth, image.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

// lock bitmap data 
System.Drawing.Imaging.BitmapData bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, bitmap.PixelFormat); 

// copy byte array to bitmap data 
System.Runtime.InteropServices.Marshal.Copy(buffer, 0, bitmapData.Scan0, buffer.Length); 

// unlock 
bitmap.UnlockBits(bitmapData); 

// copy to Color array 
var colors = new Color[Dimension, Dimension]; 
for (int i = 0; i < bitmap.Height; i++) 
    for (int j = 0; j < bitmap.Width; j++) 
    { 
     var mediacolor = bitmap.GetPixel(i, j); 
     var drawingcolor = Color.FromArgb(mediacolor.A, mediacolor.R, mediacolor.G, mediacolor.B); 
     colors[i, j] = drawingcolor; 
    } 

我希望解决,如果你需要它这个问题。