[Code C#] Giấu thông điệp vào file ảnh

Xem: 1333    Tải: 0   Thảo luận: 1   Mục: C / C++ / MFC   Lĩnh vực: Nghệ thuật - Nhiếp ảnh

0 điểm   ( 7 đánh giá ) File đã được kiểm thử

Cách dùng rất đơn giản, các bạn có thể xem demo bên dưới sẽ biết ngay!

Demo:

Thuật toán tham khảo: (dành cho các bạn yêu lập trình nhưng không dành cho các bạn pro lập trình)

- Đọc file ảnh gọi là bitmap b, đọc thông điệp gọi là str

- Tính số điểm ảnh của b, tính chiều dài của str

- Lưu chiều dài của str vào 2 pixel đầu tiên của b


+ Chiều dài giới hạn của str là 65536

+ Đổi str.Length (tức chiều dài của str) thành số hex (có 2 chữ số)

+ Lưu từng chữ số hex này vào pixel thứ 0 và thứ 1 của b

+ Để lưu một số vào 1 pixel của b, ta sẽ thay số đó vào 1 kênh màu (R, G, B) tùy ý tại pixel đó trong b


- Tính t (bước nhảy mỗi khi lưu xong 1 ký tự trong thông điệp). t = (b.Width * b.Height - 2) / str.Length;

- Duyệt qua toàn bộ str, tại mỗi ký tự ta làm như sau:


+ Lưu ký tự đó vào điểm ảnh hiện tại trong b (pixel thứ 3)

+ Tính tọa độ pixel kế tiếp để lặp lại, dựa vào t


Quá trình giải mã để lấy lại thông điệp thì ta làm tương tự nhưng ngược lại.

Code tham khảo cho class này:
 

PHP Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;


namespace hide_txt_in_image
{
    class hideMessage
    {
        private static string key = "webchatluong.com";
        public static Bitmap hideMessageIntoBitmap(string message, Bitmap b)
        {
            // giấu key            
            for (int i = 0; i < key.Length; i++)
            {
                hideByteIntoPixel((byte)key[i], i, 0, b);
            }


            // giấu length
            int l1 = message.Length / 256;
            int l2 = message.Length % 256;
            hideByteIntoPixel((byte)l1, key.Length, 0, b);
            hideByteIntoPixel((byte)l2, key.Length+1, 0, b);


            // tính bước nhảy
            int t = (b.Width * b.Height - 2 - key.Length) / message.Length;
            if (t >= 1)
            {
                int x = key.Length + 2;
                int y = 0;


                // giấu thông điệp
                for (int i = 0; i < message.Length; i++)
                {
                    if (x > b.Width)
                    {
                        y = y + x / b.Width;
                        x = x % b.Width;                        
                    }


                    hideByteIntoPixel((byte)message[i], x, y, b);
                    x += t;
                }
            }


            return b;
        }
        public static Bitmap hideByteIntoPixel(byte asscii, int x, int y, Bitmap b)
        {
            Color c = b.GetPixel(x, y);
            b.SetPixel(x, y, Color.FromArgb(c.R, asscii, c.B));
            return b;
        }


        public static string showMessageFromBitmap(Bitmap b, out bool error)
        {
            // check key
            for (int i = 0; i < key.Length; i++)
            {
                if ((byte)key[i] != showByteFromPitxel(b, i, 0))
                {
                    error = true;
                    return "";
                }
            }


            // get length
            byte l1 = showByteFromPitxel(b, key.Length, 0);
            byte l2 = showByteFromPitxel(b, key.Length+1, 0);
            int length = l1 * 256 + l2;


            // tính bước nhảy
            int t = (b.Width * b.Height - 2 - key.Length) / length;


            int x = key.Length + 2;
            int y = 0;
            string message = "";


            // giấu thông điệp
            for (int i = 0; i < length; i++)
            {
                if (x > b.Width)
                {
                    y += x / b.Width;
                    x = x % b.Width;                    
                }


                message += ((char)showByteFromPitxel(b, x, y)).ToString();
                x += t;
            }


            error = false;
            return message;
        }
        public static byte showByteFromPitxel(Bitmap b, int x, int y)
        {
            Color c = b.GetPixel(x, y);
            return c.G;
        }
    }
}  
Trong code này mình dùng kênh Green để lưu thông điệp. Ngoài ra mình thêm vào cái key trên đầu tiên, để phát hiện ảnh đó có lưu thông điệp hay chưa.

[Code C#] Giấu thông điệp vào file ảnh

[Code C#] Giấu thông điệp vào file ảnh Đăng ngày 10-01-2014  [Code C#] Giấu thông điệp vào file ảnh Cách dùng rất đơn giản, các bạn có thể xem demo bên dưới sẽ biết ngay! 5/10 1333

Thảo luận:

  • avatar
    @ hieuduong - 10:34, 16/10/2014

    làm sao để tải về được vậy bạn

     

Để bình luận bạn phải đăng nhập thành viên.

File tương tự

Files cùng mục

 
Hỗ trợ kỹ thuật cho thành viên:
Tổng đài: (+84) 246. 32.979.36
Số di động (Hotline): 0969.091.265
Thời gian làm việc:
Sáng: 8h-12h; Chiều: 13h30-17h30
(Nghỉ chiều T7, CN và các ngày lễ, tết)
Chat với Megacode
https://www.facebook.com/megacodevn
File gợi ý cho bạn
File tải nhiều nhất
Megacode.vn - Thư viện mã nguồn chia sẻ, tải file cho cộng đồng
Copyright © 2013-2016. All rights reserved. Bản quyền thuộc VinaGon
Địa chỉ: Số 38 Hàng Bè, Hàng Bạc, Hoàn Kiếm, Hà Nội.
Văn phòng giao dịch: Phòng 28, Tầng 6, HH1A Linh Đàm, Hoàng Mai, Hà Nội
Email: info@vinagon.com | Website: www.vinagon.com | Điện thoại: (+844) 6. 32.979.36;