Объект региона нельзя сериализовать напрямую, так как он не помечен как Сериализуемый. Тем не менее, вы можете легко сериализовать его в любом случае, и я согласен, что чтение региона из файла приведет к увеличению скорости на медленных машинах.
Показанного ниже метода, вероятно, будет достаточно для вас, и он продемонстрирует идею, но в производственном коде было бы больше смысла сохранить region.dat
как ресурс и скомпилировать его с вашим приложением.
Переместите GraphicsPath в список аргументов в getRegionFast (нам нужно получить его обратно), чтобы он выглядел так:
общедоступный небезопасный статический регион getRegionFast (растровое изображение, цветная прозрачность, ключ, int допуск, путь GraphicsPath)
Удалите path.Dispose()
из этого метода.
Создать этот класс:
[Serializable]
public class SerializedData
{
public SerializedData(GraphicsPath path)
{
Points = new List<PointF>(path.PathPoints);
Types = new List<byte>(path.PathTypes);
}
public List<PointF> Points { get; set; }
public List<byte> Types { get; set; }
}
Измените конструктор Form1, чтобы область была установлена следующим образом:
this.Region = GetRegionTryCached();
Скопируйте / вставьте метод GetRegionTryCached в форму Form1:
private Region GetRegionTryCached()
{
const string filePath = @".\path.dat";
<pre><code>// Check if the path has been serialized:
if (File.Exists(filePath))
{
using (FileStream fs = File.OpenRead(filePath))
{
BinaryFormatter formatter = new BinaryFormatter();
SerializedData data = (SerializedData)formatter.Deserialize(fs);
GraphicsPath path = new GraphicsPath(data.Points.ToArray(), data.Types.ToArray());
return new Region(path);
}
}
else
{
GraphicsPath path = new GraphicsPath();
// Create it as before:
Region region = BitmapToRegion.getRegionFast((Bitmap)this.BackgroundImage, Color.FromArgb(0, 255, 0), 100, path);
BinaryFormatter formatter = new BinaryFormatter();
// Serialize the path:
using (FileStream fs = File.Open(filePath, FileMode.Create, FileAccess.Write))
{
SerializedData data = new SerializedData(path);
formatter.Serialize(fs, data);
path.Dispose();
}
return region;
}
}