webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

Променете цвета на пиксела на растерно изображение в C#

  public partial class Form1 : Form
    {
        Image File;

        public Form1()
        {
            InitializeComponent();
        }

        private void Import_Click(object sender, EventArgs e)
        {
            OpenFileDialog f = new OpenFileDialog();
            f.Filter = "Image files (*.jpg, *.png) | *.jpg; *.png";
            if (f.ShowDialog() == DialogResult.OK)
            {
                File = Image.FromFile(f.FileName);
                pictureBox1.Image = File;
            }
        }

        private void Export_Click(object sender, EventArgs e)
        {
            Bitmap image = new Bitmap(File);
            image.SetPixel(50, 50, Color.Black);
            SaveFileDialog f = new SaveFileDialog();
            f.Filter = "JPG(*.JPG)|*.jpg";
            if (f.ShowDialog() == DialogResult.OK)
            {
                File.Save(f.FileName);
            }
        }
    }

Това, което искам да направя, е да импортирам изображение, да променя цвета на пиксел от него и да го експортирам.

какво правя грешно Благодаря предварително.


Отговори:


1

Всъщност има няколко проблема с вашия код:

  • Вие не затваряте файловия поток на изображението, което сте отворили, което означава, че никога няма да можете да запазите модифицираното изображение със същото име на файл. Всъщност никоя програма няма да може да презапише файла, докато вашата програма не бъде затворена.
  • Не проверявате дали редакцията е възможна; отворите изображение, което е по-малко от 51 пиксела във всяко измерение и операцията за запазване ще се срине.
  • Вие предлагате само да запазите като jpeg... формат, в който промяната на единичен пиксел неизбежно ще бъде зацапана от компресията.
  • Вие не всъщност записвате като jpeg. Запазването по подразбиране без посочване на тип ще направи изображението да завърши като png формат. Просто ще има грешно файлово разширение.
  • Както ilyas varol посочи, вие запазвате немодифицирания File вместо редактирания image.

Основните правила, които трябва да запомните, когато отваряте изображения, са следните:

За да заобиколите проблема с незатворения поток, можете вместо това да заредите изображението по следния начин:

private void Import_Click(object sender, EventArgs e)
{
    OpenFileDialog f = new OpenFileDialog();
    f.Filter = "Image files (*.jpg, *.png)|*.jpg;*.png";
    if (f.ShowDialog() != DialogResult.OK)
        return;
    using (Bitmap img = new Bitmap(f.FileName))
    {
        // if a file was already opened, dispose the old one.
        // Start by setting the shown image to null so it
        // will never try to show the disposed object.
        pictureBox1.Image = null;
        if (File != null)
        {
            try { File.Dispose(); }
            catch { /* ignore */ }
        }
        // Clone loaded image into new object
        File = new Bitmap(img);
    }
    pictureBox1.Image = File;
}

Конструкторът new Bitmap(image) е един от малкото безопасни начини за създаване на клонинг на обект на изображение, който е напълно изключен от оригиналния зареден източник . Има страничен ефект от преобразуване на изображението в 32-битов цвят, ако преди това е било в различен цветен формат.

Тук обаче има друг проблем. Във функцията за експортиране вие ​​отново правите нов Bitmap, който не изхвърляте. Защо правите този клонинг? Има ли проблем с директното използване на File? Ако няма, трябва просто да го редактирате директно и промяната на пиксела ще бъде показана и в потребителския интерфейс. Ако искате да приложите промяната само към запазената картина, отново използвайте блок using за новия обект, така че ресурсите на изображението в паметта да се почистват автоматично след това.

Освен това трябва наистина да извършите операцията само след като потребителят действително е потвърдил името на файла. Вашият код го изпълнява, дори ако натиснат Отказ, защото се изпълнява, преди дори да покажете диалоговия прозорец.

private void Export_Click(object sender, EventArgs e)
{
    SaveFileDialog f = new SaveFileDialog();
    f.Filter = "Png Image (.png)|*.png";
    if (f.ShowDialog() != DialogResult.OK)
        return;
    
    // OPTION 1: Edit "File" directly:

    // Don't edit without doing the necessary checks.
    if (File.Width > 50 && File.Height > 50)
        File.SetPixel(50, 50, Color.Black);
    File.Save(f.FileName, ImageFormat.Png);

    // OPTION 2: Edit clone without affecting "File":

    using (Bitmap image = new Bitmap(File))
    {
        // Don't edit without doing the necessary checks.
        if (image.Width > 50 && image.Height > 50)
            image.SetPixel(50, 50, Color.Black);
        image.Save(f.FileName, ImageFormat.Png);
    }
}
01.07.2021

2

След като зададете цветна операция, трябва да зададете файл отново с цветен обект.

По този начин;

image.SetPixel(50, 50, Color.Red);
File = image;

Надявам се това да работи за вас! (Кодирах и работи правилно за мен)

30.06.2021
  • Или трябва просто да редактирате File директно. Или запазете image, а не File. 01.07.2021
  • Нови материали

    Създайте разширение за Chrome с помощта на Angular
    Този урок е базиран на манифеста на разширението на chrome версия 3 (MV3), а също и на Angular версия 2+ (2, 3 и...). Ако не сте използвали манифест версия 3, можете да следвате този урок ,..

    За да научите нов език за програмиране, започнете отначало
    Първоначално публикувано на http://www.mberlove.com/blog/a-new-programming-language-starting-over/ Програмистите се гордеят със способността си да усвояват лесно нови умения , разчитайки..

    5 Youtubers на Data Science, които трябва да следвате
    Защото всички можем да се справим с малко продуктивно отлагане Всички сме падали в заешката дупка на Youtube, така че защо да не я направим продуктивна?! Като непрекъснато нарастващ източник..

    Бих казал, че точно това е проблемът с Twitter — това е инструмент на суперпотребител.
    Бих казал, че точно това е проблемът с Twitter — това е инструмент на суперпотребител. По същия начин, по който суперкодерът сочи vim като единствения начин за кодиране, но останалите от нас..

    Основи на Gradio
    Gradio е най-ефективният метод за демонстриране на вашия модел на машинно обучение и разполага с удобен за потребителя онлайн интерфейс, който го прави достъпен от всяко място. Какво прави..

    Илюстрация (GIF) за обяснение на дълбоки конволюционни мрежи (DCNN)
    В света на компютърното зрение най-основният и често срещан алгоритъм за разпознаване на изображения е конволюционната мрежа. С популярността на рамки като tensorflow и pytorch, стана по-лесно да..

    Python Bootcamp — Data Science Day 165
    Python Bootcamp от Giles McMullen-Klein беше абсолютно невероятно. Джайлс има този уникален начин да улови аудиторията си, като същевременно прави съдържанието на курса много интересно...