Пользовательская форма медленно загружается, сохраняйте область на диске!C # - PullRequest
0 голосов
/ 16 октября 2010

привет Я использую код по следующей ссылке и использую опцию fast / unsafe. однако на более медленных компьютерах все еще есть отставание. http://www.vcskicks.com/custom_shape_form_region.php

Мне было интересно, если при первом запуске приложение создает регион, а затем сохраняет его где-нибудь, или даже я предоставляю его приложению, если это ускорит его! ??

если да, как бы вы сохранили и прочитали регион?

или есть ли лучший / более быстрый подход, который я мог бы использовать?

Это приложение для Windows .net4.

ура

Ответы [ 2 ]

2 голосов
/ 16 октября 2010

Преобразование растрового изображения в регион является принципиально медленным процессом.Тем не менее, я видел, как автор упоминает GetPixel (), который настолько медленен, насколько это возможно.Чтение пикселей в растровом изображении может быть намного быстрее, если вы используете небезопасный указатель.

Код этой веб-страницы делает так, и генерирует необходимый регион.

1 голос
/ 17 октября 2010

Объект региона нельзя сериализовать напрямую, так как он не помечен как Сериализуемый. Тем не менее, вы можете легко сериализовать его в любом случае, и я согласен, что чтение региона из файла приведет к увеличению скорости на медленных машинах.

Показанного ниже метода, вероятно, будет достаточно для вас, и он продемонстрирует идею, но в производственном коде было бы больше смысла сохранить region.dat как ресурс и скомпилировать его с вашим приложением.

  1. Переместите GraphicsPath в список аргументов в getRegionFast (нам нужно получить его обратно), чтобы он выглядел так:

    общедоступный небезопасный статический регион getRegionFast (растровое изображение, цветная прозрачность, ключ, int допуск, путь GraphicsPath)

  2. Удалите path.Dispose() из этого метода.

  3. Создать этот класс:

    [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; }
    

    } ​​

  4. Измените конструктор Form1, чтобы область была установлена ​​следующим образом:

    this.Region = GetRegionTryCached();
    
  5. Скопируйте / вставьте метод 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;
    }            
    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...