Лучший способ хранить наборы изображений для Windows Forms - PullRequest
1 голос
/ 03 сентября 2011

Я занимаюсь разработкой приложений для форм Windows и буду использовать наборы изображений (думаю значки). В зависимости от темы, должны быть выбраны разные наборы изображений (позже я нарисую их, используя Bitmap).

Я думал о том, чтобы сохранить изображения в отдельных файлах (архивные файлы? Dll?), А затем загрузить их во время выполнения из основного приложения. Какой самый эффективный способ сделать это?

Спасибо за чтение.

Ответы [ 3 ]

3 голосов
/ 03 сентября 2011

Я отвечу на это, учитывая несколько сценариев.

  1. Часто ли эти изображения меняются?Затем перейдите к подходу на основе каталога, где сохраните его в каталоге и загрузите.Может быть, у вас может быть xml с именами этих файлов для загрузки.Так что меняйте имена в файлах (изображениях), просто меняйте xml.

  2. Эти файлы никогда не меняются?Затем просто вставьте их в качестве ресурсов, таким образом, они будут встроены в ваш exe / dll, и никто не сможет испортить изображения.

Обычно я видел людей, не занимающихся встраиванием.

0 голосов
/ 10 сентября 2011

Не уверен, что получил ответ, который искал.Вот пошаговое руководство по созданию ресурса dll

  1. Создание нового проекта в Visual Studio, библиотека классов
  2. Добавление ресурсов (изображений) в проект (Добавить существующий элемент)
  3. Для каждого ресурса в окне свойств установите Build Action для встроенного ресурса
  4. Скомпилируйте библиотеку, создайте dll
  5. В вашем приложении winforms теперь вы можете загрузитьэта сборка во время выполнения (Код # 1)
  6. Загрузите требуемый поток ресурсов и сохраните его в растровом объекте (Код # 2)

Код # 1

Assembly ambly = Assembly.LoadFile(pathToDll);

Код # 2

BitMap bitMap;
// where "ns" is the default namespace of the resource project    
using (Stream resourceStream = ambly.GetManifestResourceSream("ns.image.jpg"))
{
      bitMap = BitMap.FromStream(resourceStream);
}

Это основные методы, используемые для встраивания ресурсов и их загрузки во время выполнения.

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

Пример

interface IThemeResourceProvider
{
     Stream LoadBigLogo();
     Stream LoadSmallLogo();
} 

Затем внедрите этот интерфейс в свою библиотеку ресурсов

public class ThemeResourceProvider : IThemeResourceProvider
{
    public Stream LoadBigLogo()
    {
         Assembly ambly = Assembly.GetExecutingAssembly();
         return ambly.GetManifestResourceStream("namespace.image.jpg");
    }

    (...)
}

Наконец, вместо загрузки ресурса непосредственно в основное приложение, вы создаете экземплярIThemeResourceProvider найден в библиотеке ресурсов

 Assembly assembly = Assembly.LoadFile(pathToDll);

 var results = from type in assembly.GetTypes()
               where typeof(IThemeResourceProvider).IsAssignableFrom(type)
               select type;

Теперь у вас есть IEnumerable<Type> в этом списке.Как правило, у вас есть только один, но используя этот подход, вы также можете разместить несколько наборов ресурсов и реализовать несколько IThemeResourceProviders в одной и той же ресурсной DLL.Вы можете, например, идентифицировать каждый IThemeResourceProvider с именем, либо как свойство, либо с помощью пользовательского украшения [Attribute] в ваших различных реализациях.Остальное я оставлю на ваше усмотрение, чтобы выяснить.

Но вот как создать экземпляр IThemeResourceProviders в вашем списке

foreach (var providerType in results)
{
     var constructorInfo = providerType.GetConstructor(Type.EmptyTypes);
     IThemeResourceProvider provider = constructorInfo.Invoke(null);
}

И, наконец, использовать одного из этих провайдеров для получения растрового изображения:

BitMap bitMap;
using (Stream resourceStream = provider.LoadBigLogo())
{
      bitMap = BitMap.FromStream(resourceStream);
}
0 голосов
/ 10 сентября 2011

Думали ли вы об использовании файлов resx (файлов ресурсов)? Таким образом, вы можете встраивать любые изображения (значки) или все, что вам нравится, и решить загружать только файл ресурсов, необходимый для вашей темы (файлы ресурсов могут быть названы на основе имен ваших тем). Похоже, та же проблема возникла при локализации, не так ли? Но я не знаю, знаю ли это лучший способ сделать это (производительность, память и т. Д.).

...