Невозможно создать новое растровое изображение из скопированных пикселей - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть картинка, где я хочу сохранить сообщение (изменяя последний значащий бит каждого необходимого пикселя).Я использую растровое изображение для загрузки пикселей в список.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private string oEcrypt;
    private string oDecrypt;
    private List<ARGB> toCipherList = new List<ARGB>();
    private int Width;
    private int Height;
    private void button1_Click(object sender, EventArgs e)
    {
        // here i'm editing toCipherList
        Bitmap img = new Bitmap(Width, Height);
        for (int i = 0; i < img.Width; i++)
        {
            for (int j = 0; j < img.Height; j++)
            {
                Color pixel = Color.FromArgb(toCipherList[i].A, toCipherList[i].R, toCipherList[i].G, toCipherList[i].B);
                img.SetPixel(i, j, pixel);
            }
        }
        img.Save("output.jpg");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();
        oEcrypt = openFileDialog1.FileName;
        textBox3.Text = oEcrypt;
        Bitmap img = new Bitmap(oEcrypt);
        Width = img.Width;
        Height = img.Height;
        for (int i = 0; i < img.Width; i++)
        {
            for (int j = 0; j < img.Height; j++)
            {
                Color pixel = img.GetPixel(i, j);
                byte A = pixel.A;
                byte R = pixel.R;
                byte G = pixel.G;
                byte B = pixel.B;
                ARGB rGB = new ARGB(A, R, G, B);
                toCipherList.Add(rGB);
            }
        }
    }
    public class ARGB
    {
         public byte A { get; set; }
         public byte R { get; set; }
         public byte G { get; set; }
         public byte B { get; set; }

    public ARGB(byte a, byte r, byte g, byte b)
    {
        this.A = a;
        this.R = r;
        this.G = g;
        this.B = b;
    }
}

Дело в том, что даже если я не изменяю пиксели, просто создайте новое растровое изображение с пикселями, полученными из исходного изображения.Я получаю выходное изображение с некоторыми случайными вертикальными линиями.Я проверил значения, хранящиеся в списке, они совпадают с исходным изображением, когда оно было загружено.Нужно ли мне копировать больше информации?Я пробовал метод GetCopyOf из здесь , но он мне не помог, или я сделал что-то не так.

1 Ответ

0 голосов
/ 29 ноября 2018

Здесь есть много много лучших подходов.Однако ваша проблема со списком.Короче говоря, вы не читаете каждый элемент.Попробуйте это

var index = 0;
...

// loops here
Color pixel = Color.FromArgb(toCipherList[index].A, toCipherList[index].R, toCipherList[index].G, toCipherList[index].B);
index++;

Некоторые советы,

  1. Используйте LockBits намного быстрее
  2. Используйте 32bpp, тогда ваши пиксели могут быть сохранены в виде целых чисел
  3. Не беспокойтесь о ваших классах ARGB, см. Выше
...