Преобразование формата Bitmap
От: Lunohod  
Дата: 17.01.07 07:13
Оценка:
Имеется файл с картинкой формата Format8bppIndexed. Нужно загрузить его и преобразовать в формат Format32bppArgb.

Сейчас делаю так:

image_ — изображение формата Format8bppIndexed
image — изображение формата Format32bppArgb

            Bitmap image_ = new Bitmap(FileName);
            Bitmap image = new Bitmap(image_.Width, image_.Height, PixelFormat.Format32bppRgb);

            BitmapData bmpData_ = image_.LockBits(new Rectangle(0, 0, image_.Width, image_.Height), 
                ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);

            BitmapData bmpData32 = image.LockBits(new Rectangle(0, 0, image_.Width, image_.Height), 
                ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

            IntPtr bmpPtr = bmpData_.Scan0;
            IntPtr bmpPtr32 = bmpData32.Scan0;

                unsafe 
            {
                byte * pBits = (byte * ) bmpPtr;
                byte * pBits32 = (byte * ) bmpPtr32;
                byte _color;
                for(int i=0; i<image_.Height; ++i)
                    for(int k=0; k<image_.Width; ++k)
                    {
                        _color = pBits[i * image_.Width + k];

                        pBits32[4* (i * image_.Width + k)] = _color;
                        pBits32[4* (i * image_.Width + k) + 1] = _color;
                        pBits32[4* (i * image_.Width + k) + 2] = _color;
                        pBits32[4* (i * image_.Width + k) + 3] = 255;
                    }
            }
            
            image_.UnlockBits(bmpData_);
            image.UnlockBits(bmpData32);


Однако это все работает очень долго. Как это все оптимизировать?

17.01.07 12:44: Перенесено модератором из '.NET' — TK
Re: Преобразование формата Bitmap
От: Lunohod  
Дата: 19.01.07 20:29
Оценка:
Подскажите, скоростные эффективные библиотеки для работы с изображениями.
Re: Преобразование формата Bitmap
От: Аноним  
Дата: 19.01.07 21:35
Оценка:
Здравствуйте, Lunohod, Вы писали:

L>Имеется файл с картинкой формата Format8bppIndexed. Нужно загрузить его и преобразовать в формат Format32bppArgb.


L>Однако это все работает очень долго. Как это все оптимизировать?


Вот так:

<Image>
     <Image.Source>
          <FormatConvertedBitmap DestinationFormat="Bgra32" Source ="..."/>
     </Image.Source>
</Image>

Re: Преобразование формата Bitmap
От: Аноним  
Дата: 20.01.07 07:14
Оценка:
Здравствуйте, Lunohod, Вы писали:

L>Имеется файл с картинкой формата Format8bppIndexed. Нужно загрузить его и преобразовать в формат Format32bppArgb.


L>Сейчас делаю так:


L>image_ — изображение формата Format8bppIndexed

L>image — изображение формата Format32bppArgb

L>
L>            Bitmap image_ = new Bitmap(FileName);
L>            Bitmap image = new Bitmap(image_.Width, image_.Height, PixelFormat.Format32bppRgb);

L>            BitmapData bmpData_ = image_.LockBits(new Rectangle(0, 0, image_.Width, image_.Height), 
L>                ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);

L>            BitmapData bmpData32 = image.LockBits(new Rectangle(0, 0, image_.Width, image_.Height), 
L>                ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

L>            IntPtr bmpPtr = bmpData_.Scan0;
L>            IntPtr bmpPtr32 = bmpData32.Scan0;

L>                unsafe 
L>            {
L>                byte * pBits = (byte * ) bmpPtr;
L>                byte * pBits32 = (byte * ) bmpPtr32;
L>                byte _color;
L>                for(int i=0; i<image_.Height; ++i)
L>                    for(int k=0; k<image_.Width; ++k)
L>                    {
L>                        _color = pBits[i * image_.Width + k];

L>                        pBits32[4* (i * image_.Width + k)] = _color;
L>                        pBits32[4* (i * image_.Width + k) + 1] = _color;
L>                        pBits32[4* (i * image_.Width + k) + 2] = _color;
L>                        pBits32[4* (i * image_.Width + k) + 3] = 255;
L>                    }
L>            }
            
L>            image_.UnlockBits(bmpData_);
L>            image.UnlockBits(bmpData32);

L>


L>Однако это все работает очень долго. Как это все оптимизировать?


http://www.gotdotnet.ru/Forums/Common/418885.aspx
Re: Преобразование формата Bitmap
От: Morpheus_  
Дата: 22.01.07 16:58
Оценка:
Здравствуйте, Lunohod, Вы писали:

L>Имеется файл с картинкой формата Format8bppIndexed. Нужно загрузить его и преобразовать в формат Format32bppArgb.


L>Сейчас делаю так:


L><skip>


L>Однако это все работает очень долго. Как это все оптимизировать?


вот так?
            Bitmap image_ = new Bitmap(FileName);
            Bitmap image = new Bitmap(image_.Width, image_.Height, PixelFormat.Format32bppRgb);

            using(Graphics g = Graphics.FromImage(image))
                g.DrawImage(image);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Преобразование формата Bitmap
От: Morpheus_  
Дата: 22.01.07 17:00
Оценка:
Здравствуйте, Morpheus_, Вы писали:

L>>Имеется файл с картинкой формата Format8bppIndexed. Нужно загрузить его и преобразовать в формат Format32bppArgb.


L>>Сейчас делаю так:


L>><skip>


L>>Однако это все работает очень долго. Как это все оптимизировать?


M_>вот так?

M_>
M_>            Bitmap image_ = new Bitmap(FileName);
M_>            Bitmap image = new Bitmap(image_.Width, image_.Height, PixelFormat.Format32bppRgb);

M_>            using(Graphics g = Graphics.FromImage(image))
M_>                g.DrawImage(image);

M_>


сорри, опечатка

    Bitmap image_ = new Bitmap(FileName);
    Bitmap image = new Bitmap(image_.Width, image_.Height, PixelFormat.Format32bppRgb);

    using(Graphics g = Graphics.FromImage(image))
        g.DrawImage(image_);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Преобразование формата Bitmap
От: Аноним  
Дата: 17.01.07 09:06
Оценка:
Элементарная замена этого:
_color = pBits[i * image_.Width + k];
pBits32[4* (i * image_.Width + k)] = _color;
pBits32[4* (i * image_.Width + k) + 1] = _color;
pBits32[4* (i * image_.Width + k) + 2] = _color;
pBits32[4* (i * image_.Width + k) + 3] = 255;


на вот это с предварительным вычислением индекса:
int absolute = i * image_.Width + k;
byte _color = pBits[absolute];
int relative = 4 * absolute;
pBits32[relative] = _color;
pBits32[relative + 1] = _color;
pBits32[relative + 2] = _color;
pBits32[relative + 3] = 255;



даст более чем двухкратный прирост производительности.

Возможно стоит развернуть цикл и производительность окажется еще выше.

С ув. Сергей.

История — это огромная система раннего предупреждения.
Norman Cousins


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование формата Bitmap
От: Аноним  
Дата: 17.01.07 09:13
Оценка:
Прибавив к выше сказаному, предварительно вычисленные высоту и ширину(вынос их из цикла) мы получаем практически мгновенно отрабатывающую функцию:
            unsafe
            {
                byte* pBits = (byte*)bmpPtr;
                byte* pBits32 = (byte*)bmpPtr32;
                int height = image_.Height;
                int width = image_.Width;
                for (int i = 0; i < height; ++i)
                    for (int k = 0; k < width; ++k)
                    {
                        int absolute = i * width + k;
                        byte _color = pBits[absolute];
                        int relative = 4 * absolute;
                        pBits32[relative] = _color;
                        pBits32[relative + 1] = _color;
                        pBits32[relative + 2] = _color;
                        pBits32[relative + 3] = 255;
                    }
            }

            image_.UnlockBits(bmpData_);
            image.UnlockBits(bmpData32);



С ув. Сергей.

История — это огромная система раннего предупреждения.
Norman Cousins


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.