Как уменьшить яркость изображения с помощью TrackBar? - PullRequest
0 голосов
/ 29 марта 2019

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

Кто-нибудь может помочь?

Bitmap newbitmap;
private void brightnessBar_Scroll(object sender, EventArgs e)
{
  brightnessLabel.Text = brightnessBar.Value.ToString();
  newbitmap = (Bitmap)boxPic.Image;
  boxPic.Image = AdjustBrightness(newbitmap, brightnessBar.Value);
}

public static Bitmap AdjustBrightness(Bitmap Image, int Value)
{
  Bitmap TempBitmap = Image;
  float FinalValue = (float)Value / 255.0f;
  Bitmap NewBitmap = new Bitmap(TempBitmap.Width, TempBitmap.Height);
  Graphics NewGraphics = Graphics.FromImage(NewBitmap);
  float[][] FloatColorMatrix ={
    new float[] {1, 0, 0, 0, 0},
    new float[] {0, 1, 0, 0, 0},
    new float[] {0, 0, 1, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {FinalValue, FinalValue, FinalValue, 1, 1}
  };
  ColorMatrix NewColorMatrix = new ColorMatrix(FloatColorMatrix);
  ImageAttributes Attributes = new ImageAttributes();
  Attributes.SetColorMatrix(NewColorMatrix);
  NewGraphics.DrawImage(TempBitmap,
    new Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height),
    0, 0, TempBitmap.Width, TempBitmap.Height,GraphicsUnit.Pixel, Attributes);
  Attributes.Dispose();
  NewGraphics.Dispose();
  return NewBitmap;
}

1 Ответ

0 голосов
/ 29 марта 2019

Есть две проблемы с вашим кодом. Во-первых, вы меняете свое изображение и заменяете свое оригинальное изображение. Поэтому каждый раз, когда вы вносите изменения, они добавляются поверх всех ваших предыдущих изменений. Вам нужно будет где-то сохранить исходное изображение и использовать его в качестве основы для ваших изменений.

Bitmap origbitmap= null;

private void brightnessBar_Scroll(object sender, EventArgs e)
{
  //we only capture the "original" bitmap once, at the start of the operation
  //and then we hold on to it to apply all future edits against the original
  if (origbitmap== null)
      origbitmap= (Bitmap)boxPic.Image;

  brightnessLabel.Text = brightnessBar.Value.ToString();
  boxPic.Image = AdjustBrightness(origbitmap, brightnessBar.Value);
}

Вторая проблема заключается в том, что вы применяете свои изменения к компоненту 'W' ColorMatrix. Документация на ColorMatrix не так уж велика (https://docs.microsoft.com/en-us/dotnet/api/system.drawing.imaging.colormatrix?view=netframework-4.7.2)

Однако компонент W выглядит как перевод, то есть он является прямой добавкой к вашим цветовым каналам. Таким образом, результатом вашей операции является R = R + W, G = G + W, B = B + W, A = A + W. Вероятно, вам нужна скалярная операция;

float[][] FloatColorMatrix ={
    new float[] {FinalValue, 0, 0, 0, 0},
    new float[] {0, FinalValue, 0, 0, 0},
    new float[] {0, 0, FinalValue, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {0, 0, 0, 0, 1}
  };

FinalValue (с вашего трекбара) - множитель исходного цвета. Технически это не будет истинной корректировкой «Яркости» (для этого вы захотите посмотреть преобразования цветового пространства), но это будет очень простой способ линейного изменения интенсивности каждого цветового канала.

Кстати, если ваш трекбар ограничен 255, значение FinalValue никогда не будет превышать 1, а яркость вашего изображения никогда не увеличится. Если ваш трекбар поднимается до 512, FinalValue может увеличиться до 2x (с серединой на 1x), чтобы вы могли максимально увеличить интенсивность 2x на канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...