Всем привет! Имеется программа изменения яркости
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Correction {
public partial class Form1 : Form {
Bitmap pic; //Исходное изображение
public Form1() {
InitializeComponent();
try {
pic = new Bitmap(Bitmap.FromFile("default.png")); //Подгружаем изображение
}
catch { }
pictureBox1.Image = pic;
}
private void button1_Click(object sender, EventArgs e) {
int minL = 1; //Минимальное значение яркости изображения
int maxL = 0; //Максимальное значение яркости изображения
int avgL = 0; //Среднее арифметическое яркости изображения
//Собираем в цикле статистику по изображению
for (int x = 0; x < pic.Width; x++) {
for (int y = 0; y < pic.Height; y++) {
Color pixel = pic.GetPixel(x, y); //Текущий пиксель
int L = (pixel.R + pixel.G + pixel.B) / 3; //Среднее арифметическое (для цветного избражения)
if (minL > L) minL = L; //Получаем минимальное значение яркости
if (maxL < L) maxL = L; //Получаем максимальное значение яркости
avgL += L; //Суммируем все яркости
}
}
avgL = avgL / (pic.Width * pic.Height); //Получаем среднее арифметическое всех яркостей
//Конвертируем в десятичные значения яркостей делением на 255
double minLd = (double) minL / 255;
double maxLd = (double) maxL / 255;
double avgLd = (double) avgL / 255;
int newAvgL = 0; //Новая средняя яркость
Bitmap newPic = new Bitmap(pic.Width, pic.Height); //Новое изоражение для отрисовки
//Отрисовываем новое изображение и вычисляем новую среднюю яркость в цикле
for (int x = 0; x < pic.Width; x++) {
for (int y = 0; y < pic.Height; y++) {
Color pixel = pic.GetPixel(x, y); //Текущий пиксель
double param = Double.Parse(textBox1.Text); //Параметр для возведения в степень
//Получаем все цвета пикселя
int R = (int)((Math.Pow(( (double) pixel.R / 255 - minLd) / (maxLd - minLd), param)) * 255);
int G = (int)((Math.Pow(( (double) pixel.G / 255 - minLd) / (maxLd - minLd), param)) * 255);
int B = (int)((Math.Pow(( (double) pixel.B / 255 - minLd) / (maxLd - minLd), param)) * 255);
if (R < 0) R = 0;
if (G < 0) G = 0;
if (B < 0) B = 0;
newAvgL += (R + G + B) / 3; //Среднее арифметическое (для цветного избражения)
Color newPixel = Color.FromArgb(R, G, B); //Новый пиксель для отрисовки
newPic.SetPixel(x, y, newPixel);
}
}
newAvgL = newAvgL / (pic.Width * pic.Height); //Получаем новое среднее арифметическое всех яркостей
pictureBox1.Image = newPic; //Обновляем изображение на форме
label2.Text = "Brightnes: " + newAvgL; //Обновляем текст на форме
}
}
}
Все в принципе хорошо НО, нужно найти(подсчитать, а не вводить) параметр param(альфа в в формуле)
Код:
double param = Double.Parse(textBox1.Text); //Параметр для возведения в степень
Подскажите кто-нибудь, неделю с ней уже бьюсь
P.S. Найти нужно по этой формуле