using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using System.IO;
using System.Diagnostics;
using System.Collections.Concurrent;
namespace BitmapImageSpeed
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
const string path1 = @"K:\同人\[ひぐま屋] もしも近所にHなサービスをしてくれる銭湯があったら\0title.jpg";
const string path2 = @"M:\Pictures\RYLSKY_ART\aaliyah-love\178894\00.jpg";
const int count = 10;
Debug.Print("Without Scaling");
putDecodeTime(path1, doTest1, count);
putDecodeTime(path2, doTest1, count);
//Debug.Print("With Scaling");
//putDecodeTime(path1, doTest2, count);
//putDecodeTime(path2, doTest2, count);
image1.Source = new BitmapImage(new Uri(path1));
}
private void putDecodeTime(string path, Action<byte[]> act, int count = 10)
{
var data = File.ReadAllBytes(path);
var time_ms = getTime(() =>
{
var bag = new List<Task>();
var x = new ConcurrentBag<double>();
for (int i = 0; i < count; ++i)
{
bag.Add(Task.Run(() => x.Add(getTime(() => act(data)))));
//act(data);
}
Task.WaitAll(bag.ToArray());
return;
});
Debug.Print($"{time_ms / count} ms");
}
private double getTime(Action act)
{
var st = new Stopwatch();
st.Start();
act();
st.Stop();
return st.Elapsed.Ticks / 10000;
}
private void doTest1(byte[] data)
{
using (var ms = new MemoryStream(data))
{
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = ms;
image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
image.Freeze();
}
}
private void doTest2(byte[] data)
{
using (var ms = new MemoryStream(data))
{
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = ms;
image.CacheOption = BitmapCacheOption.OnLoad;
/* !!! */
image.DecodePixelHeight = 128;
image.EndInit();
image.Freeze();
}
}
}
}