Welcome Guest ( Log In | Register )

Help | Search | Members | Calendar

 
Обработка фото в С#, Нид хелп, как ускорить?
« Next Oldest | Next Newest » Track this topic | Email this topic | Print this topic
DZUK
Posted: Nov 13 2008, 21:56

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

Есть такой функшон. Как его ускорит?

CODE

       private Bitmap MixBitmaps(Bitmap src, Bitmap tar)
       {
           if (src.Height != tar.Height || src.Width != tar.Width)
           {
               MessageBox.Show("src dim!= tar dim");
               return null;
           }

           Bitmap res = new Bitmap(src.Width, src.Height);            
           
           BitmapData resData = res.LockBits(new Rectangle(0, 0, res.Width, res.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
           BitmapData srcData = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);            
           BitmapData tarData = tar.LockBits(new Rectangle(0, 0, tar.Width, tar.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
           
           unsafe                
           {
               byte* rp = (byte*)resData.Scan0.ToPointer();
               byte* sp = (byte*)srcData.Scan0.ToPointer();
               byte* tp = (byte*)tarData.Scan0.ToPointer();
               int resOffset = resData.Stride - 3 * resData.Width;
               int srcOffset = srcData.Stride - 4 * srcData.Width;
               int tarOffset = tarData.Stride - 3 * tarData.Width;

               int i, j;
               for (i = 0; i < src.Height; i++)
               {
                   for (j = 0; j < src.Width; j++)
                   {
                       rp[0] = (byte)((sp[3] * sp[0] + (255 - sp[3]) * tp[0]) / 255);
                       rp[1] = (byte)((sp[3] * sp[1] + (255 - sp[3]) * tp[1]) / 255);
                       rp[2] = (byte)((sp[3] * sp[2] + (255 - sp[3]) * tp[2]) / 255);

                       rp += 3;
                       sp += 4;
                       tp += 3;
                   }

                   rp += resOffset;
                   sp += srcOffset;
                   tp += tarOffset;
               }
           }          

           res.UnlockBits(resData);
           src.UnlockBits(srcData);
           tar.UnlockBits(tarData);
           return res;
       }


мне надо наложить один битмап на другой учитывая прозрачность. Шас пробую сделать тоже самое, тока на С++. Интерстно это я тормоз или С# все же.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Nov 13 2008, 21:58

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Забить на C# и использовать SSE по возможности.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Nov 13 2008, 22:44

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

Забить не получится, ибо я всего лиш рядовой программист, да и знаний не хватит, чтобы забить. SSE ты имееш в виду инструкции проца?

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
DZUK
Posted: Nov 13 2008, 23:17

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

После серии експерементов в С++ я пришел к выводу, что все же тормоз не я. Отсюда вопрос: как использывать код С++ в С#?

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
Dream_InspectoR
Posted: Nov 14 2008, 01:00

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Marshalling.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
DZUK
Posted: Nov 14 2008, 21:44

Light Bringer

Group: Elite Member
Member No.: 2803

Joined: March 29, 2007

В итоге сделал ДЛЛ-ку с этой функшон написанной на С++, откомпилил, вроди приемлемо. Правдо если вызывать раз 30 то все равно тормозит. Терь думаю как оптимизировать. SSE тока у Интела я так понял. Очень сложно сделать чтобы и для АМД работало?
Если кому исчо понадобиццо, вот сорс функшона:

C++ Dll
CODE

extern "C" __declspec(dllexport) void mixer(int height, int width,unsigned char *rp,unsigned char *sp,unsigned char *tp, int resOffset, int srcOffset, int tarOffset)
{
int i, j;
float s,t,a;
for (i = 0; i < height; i++)
{
 for (j = 0; j < width; j++)
 {  
  rp[0] = ((sp[3] * sp[0])+ (sp[3]^255) * tp[0])>>8;
  rp[1] = ((sp[3] * sp[1])+ (sp[3]^255) * tp[1])>>8;
  rp[2] = ((sp[3] * sp[2])+ (sp[3]^255) * tp[2])>>8;
 
  rp += 3;
  sp += 4;
  tp += 3;
 }

 rp += resOffset;
 sp += srcOffset;
 tp += tarOffset;
}
}



и часть С#
CODE

       [DllImport("Mixer.dll")]
       private unsafe static extern void mixer(int hight, int width, byte* rp, byte* sp, byte* tp, int resOffset, int srcOffset, int tarOffset);
       private Bitmap MixBitmaps(Bitmap src, Bitmap tar)
       {
           if (src.Height != tar.Height || src.Width != tar.Width)
           {
               MessageBox.Show("src dim!= tar dim");
               return null;
           }

           Bitmap res = new Bitmap(src.Width, src.Height);            
           
           BitmapData resData = res.LockBits(new Rectangle(0, 0, res.Width, res.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
           BitmapData srcData = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);            
           BitmapData tarData = tar.LockBits(new Rectangle(0, 0, tar.Width, tar.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
           
           unsafe                
           {
               byte* rp = (byte*)resData.Scan0.ToPointer();
               byte* sp = (byte*)srcData.Scan0.ToPointer();
               byte* tp = (byte*)tarData.Scan0.ToPointer();
               int resOffset = resData.Stride - 3 * resData.Width;
               int srcOffset = srcData.Stride - 4 * srcData.Width;
               int tarOffset = tarData.Stride - 3 * tarData.Width;
               mixer(src.Height, src.Width, rp, sp, tp, resOffset, srcOffset, tarOffset);
               
             
           }          

           res.UnlockBits(resData);
           src.UnlockBits(srcData);
           tar.UnlockBits(tarData);
           return res;
       }


П.С. Дрим, спасибо за наводку, узнал много нового.

--------------------
Обьединенные части целого есть нечто большее, чем просто их сумма.
 
     Top
knightmare
Posted: Nov 14 2008, 21:50

Wise Dreamer

Group: Elite Member
Member No.: 1572

Joined: October 31, 2005

Если это все в MSIL транслируется, то разве разница в производительности будет? или как?

--------------------
армия - эта крута, армейский спецназ - эта ваще крута


Хочу трахнуть Nissan Skyline R34, и ездить на Alessandra Ambrosio
 
    Top
6 replies since Nov 13 2008, 21:56 Track this topic | Email this topic | Print this topic

<< Back to Windows programming

 




Arminco Global Telecommunications