Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация создания Bitmap'a 
:(
    Опции темы
Netman
Дата 28.7.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Я создаю Bitmap кодом приведенным ниже, проблема в том что когда разрешение Bitmap большое, например [1500;1500], все начинает заметно тормозить. Вопрос как еще с оптимизировать? (функция GetColorFromValue(Map[j, i]) не влияет на производительность)

 
Код

      
            Bitmap bmp = new Bitmap(Map.GetLength(0), Map.GetLength(1));           
            System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                System.Drawing.Imaging.ImageLockMode.ReadWrite,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb);                        
            IntPtr ptr = bmpData.Scan0;
            bmpData.Stride = Map.GetLength(0) * 3;
            int bytes = bmpData.Stride * bmp.Height;
            byte[] source = new byte[bytes];           
            System.Runtime.InteropServices.Marshal.Copy(ptr, source, 0, bytes);            
            int k = 0;
            Color clr; 
            for (int i= 0; i <  Map.GetLength(1); i++)
                for (int j = 0; j < Map.GetLength(0); j++)
                {
                    clr = GetColorFromValue(Map[j, i]);                    
                    source[k++] = clr.R;
                    source[k++] = clr.G;
                    source[k++] = clr.B;
                }
            System.Runtime.InteropServices.Marshal.Copy(source, 0, ptr, bytes);
            bmp.UnlockBits(bmpData);           

PM MAIL   Вверх
Ctrl
Дата 28.7.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.2.2008
Где: Tula

Репутация: 1
Всего: 7



Надеюсь я правильно понял задачу - генерация изображения по индексной карте цветов.
Предлагаю  такие шаги для оптимизации:
1. Выкинуть промежуточный массив и работать с данными битмапа напрямую (можно будет отказаться от операций копирования)
2. Использовать не 24 бита а 32 (это позволит избавиться от тяжелых преобразований компонент цвета,
  и избавит от невыровненных байтовых операций пересылки)
3. Убрать внутренний цикл

... в общем у меня на битмапе 1500х1500 выигрыш порядка 80%

Код

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace ConsoleApplication3 {
    class Program {
        static void Main(string[] args) {
            int[,] map = new int[,] { { 0, 1, 0 }, { 1, 1, 1 }, { 1, 0, 1 }, { 0, 0, 1 } };
            Image img = ImageFromColorMap(map);
            img.Save(@"D:\img.bmp", ImageFormat.Bmp);
        }
        static Image ImageFromColorMap(int[,] Map) {
            int w = Map.GetLength(0);
            int h = Map.GetLength(1);
            Bitmap bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            unsafe {
                Int32* data = (Int32*)bmpData.Scan0.ToPointer();
                Color color = Color.Empty;
                for(int i = 0; i < w * h; i++) {
                    color = GetColorFromValue(Map[i % w, i / w]);
                    data[i] = color.ToArgb();
                }
            }
            bmp.UnlockBits(bmpData);
            return bmp;
        }
        static Color[] colors = new Color[] { Color.Red, Color.Green };
        static Color GetColorFromValue(int index) {
            return colors[index & 0x01];
        }
    }
}


PM MAIL ICQ   Вверх
Netman
Дата 29.7.2008, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Да, прикольно конечно, спасибо!

Это сообщение отредактировал(а) Netman - 29.7.2008, 07:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.