• 隐写术(将信息写入图片中)


     public partial class Form1 : Form
        {
            private Bitmap bitmapOriginal;
            private Bitmap bitmapModified;
            public Form1()
            {
                InitializeComponent();
                this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyPaint);
                try
                {
                    //load original bitmap from a file
                    bitmapOriginal = (Bitmap)Bitmap.FromFile(
                        @"..\..\katie_plaintext.jpg");

                    //center to screen
                    this.CenterToScreen();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        "Error loading image. " +
                        ex.Message);
                }
            }
            private void MyPaint(
                object sender,
                System.Windows.Forms.PaintEventArgs e)
            {
                try
                {
                    //get Graphics object for painting original
                    Graphics gPanelOriginal =
                        Graphics.FromHwnd(
                            panelOriginalImage.Handle);

                    //draw original bitmap into panel
                    gPanelOriginal.DrawImage(
                        bitmapOriginal, new Point(0, 0));

                    //return if there is no modified image yet
                    if (bitmapModified == null)
                        return;

                    //get Graphics object for painting modified
                    Graphics gPanelModified =
                        Graphics.FromHwnd(
                            panelModifiedImage.Handle);

                    //draw modified bitmap into panel
                    gPanelModified.DrawImage(
                        bitmapModified, new Point(0, 0));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        "Error drawing image." +
                        ex.Message);
                    this.Close();
                }
            }
            private void button1_Click(object sender, EventArgs e)//写入
            {
                try
                {
                    //show wait cursor
                    this.Cursor = Cursors.WaitCursor;

                    //start off with copy of original image
                    bitmapModified = new Bitmap(
                        bitmapOriginal,
                        bitmapOriginal.Width,
                        bitmapOriginal.Height);

                    //get original message to be hidden
                    int numberbytes =
                        (byte)textBoxOriginalMessage.Text.Length;
                    byte[] bytesOriginal = new byte[numberbytes + 1];
                    bytesOriginal[0] = (byte)numberbytes;
                    Encoding.UTF8.GetBytes(
                        textBoxOriginalMessage.Text,
                        0,
                        textBoxOriginalMessage.Text.Length,
                        bytesOriginal,
                        1);

                    //set bits 1, 2, 3 of byte into LSB red
                    //set bits 4, 5, 6 of byte into LSB green
                    //set bits 7 and 8 of byte into LSB blue
                    int byteCount = 0;
                    for (int i = 0; i < bitmapOriginal.Width; i++)
                    {
                        for (int j = 0; j < bitmapOriginal.Height; j++)
                        {
                            if (bytesOriginal.Length == byteCount)
                                return;

                            Color clrPixelOriginal =
                                bitmapOriginal.GetPixel(i, j);
                            byte r =
                                (byte)((clrPixelOriginal.R & ~0x7) |
                                (bytesOriginal[byteCount] >> 0) & 0x7);
                            byte g =
                                (byte)((clrPixelOriginal.G & ~0x7) |
                                (bytesOriginal[byteCount] >> 3) & 0x7);
                            byte b =
                                (byte)((clrPixelOriginal.B & ~0x3) |
                                (bytesOriginal[byteCount] >> 6) & 0x3);
                            byteCount++;

                            //set pixel to modified color
                            bitmapModified.SetPixel(
                                i, j, Color.FromArgb(r, g, b));
                        }

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        "Error hiding message." +
                        ex.Message);
                }
                finally
                {
                    //show normal cursor
                    this.Cursor = Cursors.Arrow;

                    //repaint
                    Invalidate();
                }
            }

            private void button2_Click(object sender, EventArgs e)//读取
            {
                //get bytes of message from modified image
                byte[] bytesExtracted = new byte[256 + 1];
                try
                {
                    //show wait cursor, can be time-consuming
                    this.Cursor = Cursors.WaitCursor;

                    //get bits 1, 2, 3 of byte from LSB red
                    //get bits 4, 5, 6 of byte from LSB green
                    //get bits 7 and 8 of byte from LSB blue
                    int byteCount = 0;
                    for (int i = 0; i < bitmapModified.Width; i++)
                    {
                        for (int j = 0; j < bitmapModified.Height; j++)
                        {
                            if (bytesExtracted.Length == byteCount)
                                return;

                            Color clrPixelModified =
                                bitmapModified.GetPixel(i, j);
                            byte bits123 =
                                (byte)((clrPixelModified.R & 0x7) << 0);
                            byte bits456 = (
                                byte)((clrPixelModified.G & 0x7) << 3);
                            byte bits78 = (
                                byte)((clrPixelModified.B & 0x3) << 6);

                            bytesExtracted[byteCount] =
                                (byte)(bits78 | bits456 | bits123);
                            byteCount++;
                        }

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        "Error extracting message." +
                        ex.Message);
                }
                finally
                {
                    //show normal cursor
                    this.Cursor = Cursors.Arrow;

                    //get number of bytes from start of array
                    int numberbytes = bytesExtracted[0];

                    //get remaining bytes in array into string
                    textBoxExtractedlMessage.Text =
                        Encoding.UTF8.GetString(
                        bytesExtracted,
                        1,
                        numberbytes);
                }  
            }
        }


    demo:https://files.cnblogs.com/hdjjun/windowsapplication1.rar

  • 相关阅读:
    Ceres求解直接法BA实现自动求导
    栈溢出漏洞原理详解与利用
    【机器学习】使用CNN神经网络实现对图片分类识别及模型转换
    【Android】java中调用JS的方法
    5 项大奖,70 项满分!阿里云全方位引领云原生技术升级
    分布式系统架构与云原生—阿里云《云原生架构白皮书》导读
    Dubbo-go 发布 1.5 版,朝云原生迈出关键一步
    阿里产品专家:高情商的技术人,如何做沟通?
    CNCF 新增两个孵化项目 | 云原生生态周报 Vol. 58
    掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地上篇
  • 原文地址:https://www.cnblogs.com/hdjjun/p/1223841.html
Copyright © 2020-2023  润新知