Эффективная обработка изображения в C#

Не совсем то, что вы хотите, но этот ответ наверняка кому-то поможет.

Если вы хотите изменить цвет нижней границы (тени) UINavigationBar или UIToolbar вместо того, чтобы скрывать его, вы должны установить фоновое изображение и теневое изображение для своей панели.

Для изменения нижней границы UINavigationBar (тень)

[self.navigationController.navigationBar setBackgroundImage: [UIImage imageNamed: @ "yourImageName"] forBarMetrics: UIBarMetricsDefault] ; [self.navigationController.navigationBar setShadowImage: [UIImage imageNamed: @ "yourImageName"]];

Для изменения нижней границы UIToolbar (тень)

[yourToolBar setBackgroundImage: [UIImage imageNamed: @ "yourImageName"] forToolbarPosition: UIBarPositionBottom barMetrics: UIBarMetricsDefault];

[yourToolBar setShadowImage: [UIImage imageBoTB] для_узла_позиции]: Местоположение: имя_узла: @ "МестоПоложение:" 118]

11
задан Daniel Schierbeck 28 May 2009 в 15:40
поделиться

4 ответа

Повторное использование графических объектов, вероятно, не приведет к значительному увеличению производительности.

Базовый код GDI simple создает контекст устройства для растрового изображения, загруженного в ОЗУ (DC памяти).

Узким местом вашей операции, по-видимому, является загрузка образа с диска.

Зачем перезагружать образ с диска? Если он уже находится в массиве байтов в ОЗУ, что должно быть при загрузке, вы можете просто создать поток памяти в массиве байтов, а затем создать растровое изображение из этого потока памяти.

Другими словами, сохраните его. на диск, но не перезагружайте его, просто работайте с ним из ОЗУ.

Кроме того, вам не нужно создавать новое растровое изображение для применения водяного знака (в зависимости от того, как это было сделано)

Вы должны профилировать операцию, чтобы увидеть, где ее нужно улучшить (или даже нужно ли ее улучшить).

3
ответ дан 3 December 2019 в 10:45
поделиться

Процесс кажется разумным. Каждое изображение должно существовать в памяти, прежде чем оно будет сохранено на диск, поэтому каждая версия ваших эскизов будет первой в памяти. Ключом к тому, чтобы это работало эффективно, является удаление ваших объектов Graphics и Bitmap. Самый простой способ сделать это - использовать оператор using.

using( Bitmap b = new Bitmap( 175, 175 ) )
using( Graphics g = Graphics.FromBitmap( b ) )
{
   ...
}
3
ответ дан 3 December 2019 в 10:45
поделиться

Я собираюсь выкинуть это случайно, но если вам нужно быстрое «руководство» по лучшим методам работы с изображениями, посмотрите проект Paint.NET. Бесплатные высокопрофессиональные инструменты для работы с изображениями можно найти на AForge.NET .

Преимущество AForge заключается в том, что вы можете выполнять многие из этих шагов, не создавая каждый раз новое растровое изображение. Если это для веб-сайта, я могу почти гарантировать, что код, с которым вы работаете, будет узким местом для производительности приложения.

0
ответ дан 3 December 2019 в 10:45
поделиться

Некоторое время назад я завершил аналогичный проект и провел несколько практических тестов, чтобы увидеть, есть ли разница в производительности, если я повторно использую объект Graphics, а не создаю новый для каждого изображения. В моем случае я работал над постоянным потоком большого количества изображений (> 10 000 в «партии»). Я обнаружил, что получил небольшое увеличение производительности за счет повторного использования объекта Graphics.

Я также обнаружил, что получил небольшое увеличение, используя GraphicsContainers в объекте Graphics, чтобы легко менять различные состояния в / из объекта, как это было раньше. выполнять различные действия. (В частности, мне пришлось применить обрезку и нарисовать текст и рамку (прямоугольник) на каждом изображении.) Я не знаю, имеет ли это смысл для того, что вам нужно сделать. Возможно, вы захотите взглянуть на методы BeginContainer и EndContainer в объекте Graphics.

В моем случае разница была незначительной. Я не знаю, сможете ли вы добиться большего или меньшего улучшения в своей реализации. Но поскольку вы понесете затраты на переписывание кода, вы можете рассмотреть возможность завершения текущего дизайна и выполнения некоторых тестов производительности перед переписыванием. Просто подумайте.

Некоторые ссылки могут оказаться полезными:

Использование вложенных графических контейнеров
Класс GraphicsContainer

2
ответ дан 3 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: