using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace LockBits_CS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            #if DEBUG
                MinimizeBox = false;
            #else
                MinimizeBox = true;
            #endif
        }

        private Bitmap CreateBitmap(int width, int height)
        {
            Bitmap bmp = new Bitmap(@"\Windows\msn.bmp");
            width = bmp.Size.Width;
            height = bmp.Size.Height;

            Graphics g = Graphics.FromImage(bmp);
            g.Dispose();

            return bmp;
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            using (Bitmap bmp = CreateBitmap(100, 100))
            {
                // Выводим картинку-оригинал
                e.Graphics.DrawImage(bmp, 10, 10);

                MakeMoreBlue(bmp);

                // Рисуем модифицированную картинку ниже исходного изображения
                e.Graphics.DrawImage(bmp, 10, 50);
            }
        }

        private void MakeMoreBlue(Bitmap bmp)
        {
            // Задаем формат данных о цвете для каждой точки изображения
            PixelFormat pxf = PixelFormat.Format24bppRgb;

            // Блокируем изображение в памяти
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            BitmapData bmpData =
                bmp.LockBits(rect, ImageLockMode.ReadWrite,
                pxf);

            // Получаем адрес первой строки развертки
            IntPtr ptr = bmpData.Scan0;

            // Массив, содержащий байты изображения
            int numBytes = bmp.Width * bmp.Height * 3;
            byte[] rgbValues = new byte[numBytes];

            // Копируем значения RGB в массив
            Marshal.Copy(ptr, rgbValues, 0, numBytes);

            // Модифицируем изображение, устанавливая
            // синий цвет для каждой точки в картинке
            for (int counter = 0; counter < rgbValues.Length; counter += 6)
                rgbValues[counter] = 255;

            // Копируем значения RGB обратно в изображение
            Marshal.Copy(rgbValues, 0, ptr, numBytes);

            // Разблокируем биты в памяти
            bmp.UnlockBits(bmpData);
        }
    }
}