انسخ نقار نقطات صغير إلى صورة نقطية كبيرة مع مزيج الشفافية: ما هو أسرع من الرسومات.

StackOverflow https://stackoverflow.com/questions/2475233

سؤال

لقد حددت هذه المكالمة على أنها عنق الزجاجة في وظيفة الضغط العالي.

graphics.DrawImage(smallBitmap, x , y);

هل هناك طريقة أسرع لمزج البيت النقطي شبه الشفاف في واحدة شفافة أكبر؟

مثال الاستخدام:

XY[] locations = GetLocs();
     Bitmap[] bitmaps = GetBmps(); //small images sizes vary approx 30px x 30px

        using (Bitmap large = new Bitmap(500, 500, PixelFormat.Format32bppPArgb))
        using (Graphics largeGraphics = Graphics.FromImage(large))
        {
          for(var i=0; i < largeNumber; i++)
          {
            //this is the bottleneck
            largeGraphics.DrawImage(bitmaps[i], locations[i].x , locations[i].y); 
         }
       }

       var done = new MemoryStream(); 
       large.Save(done, ImageFormat.Png); 
       done.Position = 0;
       return (done);

تستغرق مكالمات DrawImage عبارة عن خلفات صغيرة تبلغ 32BPPPPargb صغيرة وتنسخها إلى صورة نقطية أكبر في المواقع التي تختلف وخلاف النقطات الصغيرة قد تتداخل جزئيًا فقط مع منطقة البيت الكبيرة. تحتوي كلتا الصورتين على محتويات شبه شفافة يتم مزجها بواسطة DrawImage بطريقة مهمة للإخراج. لقد أجريت بعض الاختبارات باستخدام bitblt ولكن لم أر تحسنًا كبيرًا في السرعة ولم يخرج مزج ألفا بنفس الشيء في اختباراتي. أنا منفتح على أي طريقة فقط بما في ذلك مكالمة أفضل إلى Bitblt أو رمز C# غير الآمن.

هل كانت مفيدة؟

المحلول

بعد بعض الاختبارات ، أرى أن دان كان على حق (انظر التعليقات أعلاه). من الممكن التغلب على أداء صورة GDI Draw إذا لم تكن بحاجة إلى جميع ميزات المزج التي يقدمها ، ولكن في حالة مزيج الشفافية لا أعتقد أن هناك مجالًا لتحسين المواد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top