Nadesłany przez Tomasz Lubiński, 26 września 2019 12:10
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
negatyw/Form1.cs:
//Negatyw
//(c) 2019 by Tomasz Lubinski
//www.algorytm.org
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace Negatyw
{
public partial class Form1 : Form
{
/// <summary>
/// Zainicjuj
/// </summary>
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Wczytaj obraz
/// </summary>
private void wczytaj_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Otwórz obraz";
dlg.Filter = "pliki jpg (*.jpg)|*.jpg";
if (dlg.ShowDialog() == DialogResult.OK)
{
picture.Image = new Bitmap(dlg.OpenFile());
picture.Height = picture.Image.Height;
picture.Width = picture.Image.Width;
this.ClientSize = new System.Drawing.Size(Math.Max(picture.Width + 32, 300), picture.Height + 80);
}
dlg.Dispose();
}
/// <summary>
/// Efekt negatywu
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void negative_Click(object sender, EventArgs e)
{
//Nie rob nic jezeli obraz jest jeszcze niewczytany
if (picture.Image == null)
{
return;
}
//Pobierz wartosc wszystkich punktow obrazu
Bitmap bitmap = (Bitmap)picture.Image;
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, picture.Width, picture.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
byte[] pixelValues = new byte[Math.Abs(bmpData.Stride) * picture.Height];
System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, pixelValues, 0, pixelValues.Length);
//Odwroc wartosc kazdego punktu dla kazdej skladowej
for (int i = 0; i < pixelValues.Length; i++)
{
pixelValues[i] = (byte)(255 - pixelValues[i]);
}
//Wczytaj przetworzony obraz
System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, bmpData.Scan0, pixelValues.Length);
bitmap.UnlockBits(bmpData);
picture.Refresh();
}
}
}

