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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ BitMap 
:(
    Опции темы
Хоббит
Дата 10.5.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



При попиксельном анализе рисунка, загруженного в BitMap тратиться много времени на функции GepPixel и SetPixel ... можно ли как нибудь считать картинку в массив целых чисел (или в 3 массива R G B составляющих) а потом загрузить обратно.
 
PM MAIL   Вверх
ivashkanet
Дата 11.5.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Ты считаешь с конвертированием будет быстрее?  smile 
Код

Bitmap bm = new Bitmap(100, 100);
byte[, ,] PixelColors = new byte[bm.Width, bm.Height, 3];
for (x = 0; x < bm.Width; x++)
{
    for (y = 0; y < bm.Height; y++)
   {
      Color PixelColor = bm.GetPixel(x, y);
      PixelColors[x, y, 0] = PixelColor.R;
      PixelColors[x, y, 1] = PixelColor.G;
      PixelColors[x, y, 2] = PixelColor.B;
   }
}
 
P.S. там еще есть PixelColor.A, какая-то альфа  smile

Добавлено @ 08:43 
Цитата(Хоббит @  10.5.2006,  22:43 Найти цитируемый пост)
GepPixel и SetPixel

MSDN предлагает именно так делать  smile  

Это сообщение отредактировал(а) ivashkanet - 11.5.2006, 08:42
PM MAIL WWW ICQ   Вверх
VisualProgrammerNET
Дата 11.5.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Цитата(ivashkanet @  11.5.2006,  08:40 Найти цитируемый пост)
P.S. там еще есть PixelColor.A, какая-то альфа  

Коэффициент прозрачности.

Попробуй считывать битмап в несколько потоков. Хотя не уверен, что прирост в производительности будет... если вообще будет!  smile  


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 11.5.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(Хоббит @  10.5.2006,  21:43 Найти цитируемый пост)
При попиксельном анализе рисунка, загруженного в BitMap тратиться много времени на функции GepPixel и SetPixel ... можно ли как нибудь считать картинку в массив целых чисел (или в 3 массива R G B составляющих) а потом загрузить обратно.

Картинку можно залочить в IntPtr, откуда скопировать в байтовый массив и работать с ним напрямую. Это будет в несколько раз быстрее, чем GetPixel / SetPixel. Но при этом нужно знать, в каком байте что лежит.

Простой пример операций над битмапом в памяти:

Код
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Diagnostics;

class TestApp
{
    static void Main(string[] args)
    {
        // зачитываем картинку
        Bitmap bmp = (Bitmap)Image.FromFile(@"c:\1.bmp");

        // копируем в массив в формате 32bit
        BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
        byte[] arr = new byte[data.Stride * data.Height];
        Marshal.Copy(data.Scan0, arr, 0, arr.Length);

        // выполняем какие-либо операции над пикселами...
        int iArr = 0;
        for (int y = 0; y < data.Height; y++)
        {
            for(int x = 0; x < data.Width; x++)
            {
                // получаем цвет пиксела (расписываю подробно)
                int blue = arr[iArr];
                int green = arr[iArr + 1];
                int red = arr[iArr + 2];
                int alpha = arr[iArr + 3];

                // выполняем какую-либо операцию над пикселом,
                // например заменяем все белые пикселы прозрачными
                if (red == 255 && green == 255 && blue == 255)
                    red = green = blue = alpha = 0;

                // сохраняем в массив
                arr[iArr] = (byte)blue;
                arr[iArr + 1] = (byte)green;
                arr[iArr + 2] = (byte)red;
                arr[iArr + 3] = (byte)alpha;

                // сдвиг к следующему пикселу (4 байта)
                iArr += 4;
            }
        }

        // копируем из массива в битмап
        Marshal.Copy(arr, 0, data.Scan0, arr.Length);

        // разлочиваем битмап и сохраняем в файл
        bmp.UnlockBits(data);
        bmp.Save(@"c:\2.bmp");
    }
}

 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 11.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



... а парамет PixelFormat можно преобраховывать.... то есть из jpg получить bmp ... или из bmp 32 разрядного 24 разрядный 
PM MAIL   Вверх
mr.DUDA
Дата 11.5.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



можно вроде 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 11.5.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



работает .. раз в 5 быстрее .... Но почему ты написал цвета в порядке BGRA ...  в MSDN примере .... первый цвет по любому красный !!! 
PM MAIL   Вверх
mr.DUDA
Дата 11.5.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(Хоббит @  11.5.2006,  15:09 Найти цитируемый пост)
Но почему ты написал цвета в порядке BGRA ...  в MSDN примере .... первый цвет по любому красный !!!  

полюбому, в отладчике именно так smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 13.5.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



.... ага ... теперь заметил smile ... когда вместо синего красненький увидел  
PM MAIL   Вверх
mr.DUDA
Дата 13.5.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Дело в порядке байтов в двойном слове: сначала идут младшие, потом старшие. Если в ARGB самый старший - А, то и идёт он в четвёрке байт последним. 


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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