Вопрос по Bitmap и выгрузке картинки из файла

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
Здравствуйте! Прошу помощи, извиняюсь, если вопрос сильно глупый))

есть код (прикреплен).
Это изменение контрастности в фотках посредством битмап. Изначально предусмотрена загрузка конкретного файла с непосредственным указанием имени оного. Я же хочу добиться, чтобы файл выбирался первый попавшийся и затем с ним манипулировали.
Я уже несколько часов пытаюсь этого добиться. Отладчик по-разному ругается. Сейчас вот:
"Выполнение действия CSharp OwnCode. В GDI+ возникла ошибка общего вида." :dx::dx::dx:

Помогите, плиз!
 

Вложения

  • 21,6 КБ Просмотры: 64

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
C#:
Random rnd = new Random();
//Случайный уровень контрастности 0т 16 до 28. Чем он выше, тем контрастнее и ярче картинка на выходе
int threshold = rnd.Next(16,28);
string d = project.Directory + @"\avito\photos\";   
string[] ld = System.IO.Directory.GetFiles(d, "*.*", System.IO.SearchOption.AllDirectories);
string s = ld[0];

//using (System.Drawing.Bitmap sourceBitmap = new Bitmap(System.Drawing.Image.FromFile(s)));
Bitmap sourceBitmap = new Bitmap(System.Drawing.Image.FromFile(s));
System.Drawing.Imaging.BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                sourceBitmap.Width, sourceBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

byte[] pixelBuffer = new byte  [sourceData.Stride * sourceData.Height];
System.Runtime.InteropServices.Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);
sourceBitmap.UnlockBits(sourceData);

double contrastLevel = Math.Pow((100.0 + threshold) / 100.0, 2);
double blue = 0;
double green = 0;
double red = 0;
for (int k = 0; k + 4 < pixelBuffer.Length; k += 4) {
    blue = ((((pixelBuffer[k] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    green = ((((pixelBuffer[k + 1] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    red = ((((pixelBuffer[k + 2] / 255.0) - 0.5) * 
                    contrastLevel) + 0.5) * 255.0;   
        if  (blue > 255)
        { blue = 255; }
        else if  (blue < 0)
        { blue = 0; }

        if (green > 255)
        { green = 255; }
        else if (green < 0)
        { green = 0; }
  
        if (red > 255)
        { red = 255; }
        else if (red < 0)
        { red = 0; }

        pixelBuffer[k] = (byte)blue;
        pixelBuffer[k + 1] = (byte)green;
        pixelBuffer[k + 2] = (byte)red;
    }
Bitmap resultBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);
System.Drawing.Imaging.BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                resultBitmap.Width, resultBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(pixelBuffer, 0, resultData.Scan0, pixelBuffer.Length);
resultBitmap.UnlockBits(resultData);
resultBitmap.Save(project.Directory + @"\avito\newphoto", System.Drawing.Imaging.ImageFormat.Jpeg);

resultBitmap.Dispose();
sourceBitmap.Dispose();
 

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
Понял. Странно. Выложил весь код. Посмотрите, пожалуйста.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
C#:
resultBitmap.Save(project.Directory + @"\avito\newphoto", System.Drawing.Imaging.ImageFormat.Jpeg);
это что ? где имя файла ?
Блин, нету (( Тогда еще сложнее. Я не понимаю как сослаться в этой строке на измененный файл.((
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
в общем эта ошибка "Выполнение действия CSharp OwnCode. В GDI+ возникла ошибка общего вида."
возникает когда в пути сохранения файла, не существует папки. сначала надо создать все папки, а потом писать туда файл.
ну а так рабочий код.
 
  • Спасибо
Реакции: Mike и alex_tal

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
в общем эта ошибка "Выполнение действия CSharp OwnCode. В GDI+ возникла ошибка общего вида."
возникает когда в пути сохранения файла, не существует папки. сначала надо создать все папки, а потом писать туда файл.
ну а так рабочий код.
Спасибо, буду пробовать!
 

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
Пробовал. Долго. Безрезультатно((
Может, кто-нибудь подскажет, как сохранять эти файлы???
Пробовал:
resultBitmap.Save(s + "_new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
resultBitmap.Save(project.Directory + "_new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
и смесь этого. ТЕперь даже ошибок не пишет - только "действие не выполнено".
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
Пробовал. Долго. Безрезультатно((
Может, кто-нибудь подскажет, как сохранять эти файлы???
Пробовал:
resultBitmap.Save(s + "_new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
resultBitmap.Save(project.Directory + "_new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
и смесь этого. ТЕперь даже ошибок не пишет - только "действие не выполнено".
выведи в лог
s + "_new.jpg"
project.Directory + "_new.jpg"
что они показывают ? и попробуй сам ручками перейти в сформированные пути.
так же для пробы пробни статичный путь . типа "C:\pic1.jpg"
 

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
вообще ничего в лог не выводит ("действие не выполнено") по обоим вариантам


при наведении курсора на кубик c# пишет "не указана переменная для записи кода завершения".
 
Последнее редактирование:

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
если добавляю resultBitmap.Save(project.Directory + s + "_new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
то "данный формат пути не поддерживается"

Код, доходя до стр 46 возвращается к стр 22.
 
Последнее редактирование:

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
в директории проекта создай папку "фото" и закинь туда фотки, которые надо обработать

C#:
bool delete = true; //напишите false, если не надо удалять оригинальное фото

Random rnd = new Random();
//Случайный уровень контрастности 0т 16 до 28. Чем он выше, тем контрастнее и ярче картинка на выходе
int threshold = rnd.Next(16,28);
string d = project.Directory + @"\фото\";   //путь к директории
if(!Directory.Exists(d))
{
    Directory.CreateDirectory(d);
    throw new Exception("положите фотографии для обработки в папку фото");
}
string[] ld = System.IO.Directory.GetFiles(d, "*.*", System.IO.SearchOption.AllDirectories);
if(ld.Length == 0) throw new Exception("нет фото для обработки");
int sl = rnd.Next(ld.Length);
string s = ld[sl];

//using (System.Drawing.Bitmap sourceBitmap = new Bitmap(System.Drawing.Image.FromFile(s)));
Image img = System.Drawing.Image.FromFile(s);
Bitmap sourceBitmap = new Bitmap(img);
System.Drawing.Imaging.BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                sourceBitmap.Width, sourceBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

byte[] pixelBuffer = new byte  [sourceData.Stride * sourceData.Height];
System.Runtime.InteropServices.Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);
sourceBitmap.UnlockBits(sourceData);

double contrastLevel = Math.Pow((100.0 + threshold) / 100.0, 2);
double blue = 0;
double green = 0;
double red = 0;
for (int k = 0; k + 4 < pixelBuffer.Length; k += 4) {
    blue = ((((pixelBuffer[k] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    green = ((((pixelBuffer[k + 1] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    red = ((((pixelBuffer[k + 2] / 255.0) - 0.5) *
                    contrastLevel) + 0.5) * 255.0;  
        if  (blue > 255)
        { blue = 255; }
        else if  (blue < 0)
        { blue = 0; }

        if (green > 255)
        { green = 255; }
        else if (green < 0)
        { green = 0; }
 
        if (red > 255)
        { red = 255; }
        else if (red < 0)
        { red = 0; }

        pixelBuffer[k] = (byte)blue;
        pixelBuffer[k + 1] = (byte)green;
        pixelBuffer[k + 2] = (byte)red;
    }
int width = sourceBitmap.Width;
int height = sourceBitmap.Height;
sourceBitmap.Dispose();

Bitmap resultBitmap = new Bitmap(width, height);
System.Drawing.Imaging.BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                resultBitmap.Width, resultBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(pixelBuffer, 0, resultData.Scan0, pixelBuffer.Length);
resultBitmap.UnlockBits(resultData);

string pathDir = project.Directory + @"\обработанное фото\";
if(!Directory.Exists(pathDir)) Directory.CreateDirectory(pathDir);

string pathResult = pathDir + Path.GetFileName(ld[sl]);
if(Directory.GetFiles(pathDir).ToList().Contains(pathResult)) pathResult = pathDir + Path.GetFileNameWithoutExtension(ld[sl]) + rnd.Next(10000,99999).ToString() + ".jpg";
resultBitmap.Save(pathResult, System.Drawing.Imaging.ImageFormat.Jpeg);


resultBitmap.Dispose();
img.Dispose();

if(delete) File.Delete(ld[sl]);
up. добавил возможность удаления фото
 
Последнее редактирование:
  • Спасибо
Реакции: alex_tal и Alexmd

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
в директории проекта создай папку "фото" и закинь туда фотки, которые надо обработать

C#:
bool delete = true; //напишите false, если не надо удалять оригинальное фото

Random rnd = new Random();
//Случайный уровень контрастности 0т 16 до 28. Чем он выше, тем контрастнее и ярче картинка на выходе
int threshold = rnd.Next(16,28);
string d = project.Directory + @"\фото\";   //путь к директории
if(!Directory.Exists(d))
{
    Directory.CreateDirectory(d);
    throw new Exception("положите фотографии для обработки в папку фото");
}
string[] ld = System.IO.Directory.GetFiles(d, "*.*", System.IO.SearchOption.AllDirectories);
if(ld.Length == 0) throw new Exception("нет фото для обработки");
int sl = rnd.Next(ld.Length);
string s = ld[sl];

//using (System.Drawing.Bitmap sourceBitmap = new Bitmap(System.Drawing.Image.FromFile(s)));
Image img = System.Drawing.Image.FromFile(s);
Bitmap sourceBitmap = new Bitmap(img);
System.Drawing.Imaging.BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                sourceBitmap.Width, sourceBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

byte[] pixelBuffer = new byte  [sourceData.Stride * sourceData.Height];
System.Runtime.InteropServices.Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);
sourceBitmap.UnlockBits(sourceData);

double contrastLevel = Math.Pow((100.0 + threshold) / 100.0, 2);
double blue = 0;
double green = 0;
double red = 0;
for (int k = 0; k + 4 < pixelBuffer.Length; k += 4) {
    blue = ((((pixelBuffer[k] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    green = ((((pixelBuffer[k + 1] / 255.0) - 0.5) * contrastLevel) + 0.5) * 255.0;
    red = ((((pixelBuffer[k + 2] / 255.0) - 0.5) *
                    contrastLevel) + 0.5) * 255.0; 
        if  (blue > 255)
        { blue = 255; }
        else if  (blue < 0)
        { blue = 0; }

        if (green > 255)
        { green = 255; }
        else if (green < 0)
        { green = 0; }

        if (red > 255)
        { red = 255; }
        else if (red < 0)
        { red = 0; }

        pixelBuffer[k] = (byte)blue;
        pixelBuffer[k + 1] = (byte)green;
        pixelBuffer[k + 2] = (byte)red;
    }
int width = sourceBitmap.Width;
int height = sourceBitmap.Height;
sourceBitmap.Dispose();

Bitmap resultBitmap = new Bitmap(width, height);
System.Drawing.Imaging.BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                resultBitmap.Width, resultBitmap.Height),
                                System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(pixelBuffer, 0, resultData.Scan0, pixelBuffer.Length);
resultBitmap.UnlockBits(resultData);

string pathDir = project.Directory + @"\обработанное фото\";
if(!Directory.Exists(pathDir)) Directory.CreateDirectory(pathDir);

string pathResult = pathDir + Path.GetFileName(ld[sl]);
if(Directory.GetFiles(pathDir).ToList().Contains(pathResult)) pathResult = pathDir + Path.GetFileNameWithoutExtension(ld[sl]) + rnd.Next(10000,99999).ToString() + ".jpg";
resultBitmap.Save(pathResult, System.Drawing.Imaging.ImageFormat.Jpeg);


resultBitmap.Dispose();
img.Dispose();

if(delete) File.Delete(ld[sl]);
up. добавил возможность удаления фото
Спасибо вам огромное, добрый человек!!! С# тяжко мне дается((
 

alex_tal

Client
Регистрация
30.11.2017
Сообщения
47
Благодарностей
5
Баллы
8
Долго и вдумчиво читал ваш код: стало немного понятнее )) Еще раз огромное спасибО!
 
  • Спасибо
Реакции: volody00

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)