如何在win8应用程序中获取图像像素

时间:2013-02-12 05:56:12

标签: windows-8 windows-runtime

在c#中我们可以使用像素来比较图像,

        Bitmap b1 = new Bitmap(textBox1.Text);
        Bitmap b2 = new Bitmap(textBox2.Text);       
            for (int x = 0; x < b1.Width; x++)
            {
                for (int y = 0; y < b1.Height; y++)
                {
                    if (b1.GetPixel(x, y) != b2.GetPixel(x, y))
                    {
                        Console.Out.Write("Mismatch");
                    }
                }
            }

winRT应用程序像素如何通过这种方式进行比较?

提前致谢

1 个答案:

答案 0 :(得分:1)

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace App110
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            Test();
        }

        private async void Test()
        {
            // Comparing image to itself should return true
            Debug.Assert(await ComparePackageImages("Assets\\Logo.png", "Assets\\Logo.png"));

            // "Copy of Logo.png" is "Logo.png" with changed one pixel
            // and should return false when compared with "Logo.png"
            Debug.Assert(!await ComparePackageImages("Assets\\Logo.png", "Assets\\Copy of Logo.png"));

            // Two images of different size should 
            Debug.Assert(!await ComparePackageImages("Assets\\Logo.png", "Assets\\SmallLogo.png"));

            await new MessageDialog("Success!").ShowAsync();
            Application.Current.Exit();
        }

        private async Task<bool> ComparePackageImages(string packageFilePath1, string packageFilePath2)
        {
            var b1 = await LoadWriteableBitmapFromPackageFilePath(packageFilePath1);
            var b2 = await LoadWriteableBitmapFromPackageFilePath(packageFilePath2);

            var pixelStream1 = b1.PixelBuffer.AsStream();
            var pixelStream2 = b2.PixelBuffer.AsStream();

            return StreamEquals(pixelStream1, pixelStream2);
        }

        private static async Task<WriteableBitmap> LoadWriteableBitmapFromPackageFilePath(string packageFilePath1)
        {
            var bitmap = new WriteableBitmap(1, 1);
            var storageFile = await Package.Current.InstalledLocation.GetFileAsync(packageFilePath1);

            using (var streamWithContentType = await storageFile.OpenReadAsync())
            {
                await bitmap.SetSourceAsync(streamWithContentType);
            }

            return bitmap;
        }

        static bool StreamEquals(Stream stream1, Stream stream2)
        {
            const int bufferSize = 2048;
            byte[] buffer1 = new byte[bufferSize]; //buffer size
            byte[] buffer2 = new byte[bufferSize];

            while (true)
            {
                int count1 = stream1.Read(buffer1, 0, bufferSize);
                int count2 = stream2.Read(buffer2, 0, bufferSize);

                if (count1 != count2)
                    return false;

                if (count1 == 0)
                    return true;

                // You might replace the following with an efficient "memcmp"
                if (!buffer1.Take(count1).SequenceEqual(buffer2.Take(count2)))
                    return false;
            }
        }
    }
}

流式比较由Compare binary files in C#提供。

位图访问代码段由WinRT XAML Toolkit提供。