Оптимизация области интереса (ROI) рисунок на рисунке


Я рисую прямоугольный РОИ области по потемнению области за ее пределами, как на этом изображении:

enter image description here

Но изображения.MakeTransparent занимает слишком много времени. Что является лучшим способом, чтобы увеличить скорость волочения?

void DrawRoi(Bitmap Image, RectangleF rect)
{
        Rectangle roi = new Rectangle();

        roi.X = (int)((float)Image.Width * rect.X);
        roi.Y = (int)((float)Image.Height * rect.Y);
        roi.Width = (int)((float)Image.Width * rect.Width);
        roi.Height = (int)((float)Image.Height * rect.Height);

        Stopwatch timer = new Stopwatch();
        timer.Start();
        // graphics manipulation takes about 240ms on 1080p image
        using (Bitmap roiMaskImage = CreateRoiMaskImage(ImageWithRoi.Width, ImageWithRoi.Height, roi))
        {
                using (Graphics g = Graphics.FromImage(ImageWithRoi))
                {                                
                        g.DrawImage(Image, 0, 0);
                        g.DrawImage(roiMaskImage, 0, 0);
                        Pen borderPen = CreateRoiBorderPen(ImageWithRoi);
                        g.DrawRectangle(borderPen, roi);
                }
        }
        Debug.WriteLine("roi graphics: {0}ms", timer.ElapsedMilliseconds);
        this.imagePictureBox.Image = ImageWithRoi;
}

Bitmap CreateRoiMaskImage(int width, int height, Rectangle roi)
{
        Bitmap image = new Bitmap(width, height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(image))
        {
                SolidBrush dimBrush = new SolidBrush(Color.FromArgb(64, 0, 0, 0));
                g.FillRectangle(dimBrush, 0, 0, width, height);
                SolidBrush roiBrush = new SolidBrush(Color.Red);
                g.FillRectangle(roiBrush, roi);
                image.MakeTransparent(Color.Red);
                return image;
        }                
}

Pen CreateRoiBorderPen(Bitmap image)
{
        float width = ((float)(image.Width + image.Height) * 2.5f) / (float)(640 + 480);
        if (width < 1.0f)
                width = 1.0f;
        Pen pen = new Pen(Color.FromArgb(255, 0, 255, 0), width);
        return pen;
}


1958
2
задан 3 сентября 2011 в 07:09 Источник Поделиться
Комментарии
1 ответ

Ну, вы могли бы попробовать буквально потемнение изображения на 25%, не создавая 25%-непрозрачный черный район, но только путем вычисления цвета одного цвета, 25% темнее, без необходимости создания новой 32bbp растрового изображения.

Это может помочь: формула для определения яркости цвета RGB (сайте StackOverflow). Исходя из этого, допустим, вы выбрать у = 0.2126 Р + 0.7152 г + 0.0722 B в качестве вашего яркости формулы и 0.75 и новая яркость внешняя часть изображения, каждый пиксель должен быть изменен на:

Y = 0.75 * (0.2126 * R + 0.7152 * G + 0.0722 * B)
(R, G, B)' = (R - Y * 0.2126, G - Y * 0.7152, B - Y * 0.0722)

(Два раза я понял, что формулу я выложил здесь было совсем не так... в этот раз я более уверенно, но это может быть, что в этом нет смысла, когда рисовал, я не проверял.)

Это потребует, чтобы выполнить итерации через каждый отдельный пиксель за пределами центральной площади, поэтому не уверен, если это будет быстрее, в конце концов... Но как и все выступление, скажу только измерения!

2
ответ дан 3 сентября 2011 в 07:09 Источник Поделиться