Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2016, 17:08   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Изображения BMP и JPEG

Всем привет.
Я сделал собственный шифровальщик, который оптимизировал под шифрование изображений формата BMP - на выходе из шифрования я получаю такой же файл BMP, только содержимое превращено в ересь. Собственно, вся эта каша работает и в обратную сторону - ересь в файле BMP тем же ключом шифрования можно превратить в нормальное содержимое.
До определённого момента - вот отсюда начинаются проблемы.
Если зашифрованное изображение формата BMP сохранить в формате JPEG/PNG, и уже из полученного JPEG/PNG опять сделать BMP - то содержимое конечного BMP мягко говоря не дешифруется.

Моя функция загрузки пикселей из BMP:
Код:
private Size PrepareImageData(ref string directoryname)
{
	Bitmap image=new Bitmap(filename); // указанное пользователем изображение
	string outfname=directoryname+"\\tmp.dat";
	FileStream outtotmp=new FileStream(outfname,FileMode.Create); // в файл будут записываться пиксели в порядке их считывания
	int
		width=image.Width, // ширина изображения
		height=image.Height, // высота изображения
		i,g;
	Color data;
	for (i=0;i<height;i++)
		for (g=0;g<width;g++)
		{
			data=image.GetPixel(g,i); // берём один пиксель, и по очереди закидываем в файл
			outtotmp.WriteByte(data.R); // красный канал
			outtotmp.WriteByte(data.G); // зелёный канал
			outtotmp.WriteByte(data.B); // синий канал
		}
	image.Dispose();
	image=null;
	outfname=null;
	outtotmp.Close(); // полученный файл шифруется как обычный файл
	outtotmp.Dispose();
	outtotmp=null;
	Size result=new Size(width,height); // понадобится при формировании изображения
	return result;
}
После выполнения этой функции выполняется само шифрование, которое забирает данные из "\\tmp.dat", и записывает зашифрованные данные в файл "\\tmp_encrypted.dat".

Функция компиляции изображения из зашифрованных данных:
Код:
private void CompileImage(string directoryname,string imagename,Size size)
{
	FileStream input=new FileStream(directoryname+"\\tmp_encrypted.dat",FileMode.Open); // зашифрованные данные
	input.Lock(0,input.Length);
	Bitmap image=new Bitmap(size.Width,size.Height); // собсна, конечная картинка
	Color data=new Color();
	int i,g;
	byte red,green,blue;
	for (i=0;i<size.Height;i++)
		for (g=0;g<size.Width;g++)
		{
			red=(byte)input.ReadByte();
			green=(byte)input.ReadByte();
			blue=(byte)input.ReadByte();
			data=Color.FromArgb(red,green,blue); // три байта по очереди пихаем в один пиксель
			image.SetPixel(g,i,data); // и ставим его в изображение
		}
	input.Unlock(0,input.Length);
	input.Close();
	input.Dispose();
	input=null;
	image.Save(directoryname+"\\"+imagename+"_encrypted.bmp"); // на выходе получаем изображение с зашифрованным содержимым
	image.Dispose();
	image=null;
}
Всё это работает правильно до тех пор, пока зашифрованное изображение не будет сохранено в каком нибудь другом формате (BMP -> JPEG -> BMP). То есть, моя программа воспринимает только BMP файлы.

Вопрос: как работать с форматом JPEG при том, что шифровать нужно именно байты, которые берутся именно из матрицы пикселей ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 04.08.2016, 18:22   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Можно сделать так:
Код:
Image initial=Image.FromFile(filename); // изображение любого формата
Bitmap image=new Bitmap(initial); // из загруженного изображения забираем матрицу пикселей
// ... тут дальнейшая работа с image
Потом формировать такой же Bitmap image из данных.
Но, как из полученного Bitmap image сделать Image final ?
И будет ли он правильно сохранён в формате JPEG ?
И это я ещё не дошёл до главного вопроса: приведёт ли обратная процедура к изначальным данным ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 04.08.2016, 19:00   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

JPEG формат с потерями, он не гарантирует что при снятии сжатия будет тоже самой байт в байт.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2016, 19:13   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
JPEG формат с потерями, он не гарантирует что при снятии сжатия будет тоже самой байт в байт.
Только что порылся в гугле - действительно ...
У PNG сжатие без потерь, и при моих махинациях вместо JPEG использовать PNG - то из "восстановленного" шифрованного BMP будет получена исходная картинка ...
Что же, беда с джипегом, а я так на него надеялся ...
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 04.08.2016, 19:29   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это смысл JPEG, а не беда
картинки, как и аудио позволяют сжатие с потерями.(MP3 сжатие с потерями, FLAC без)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2016, 19:40   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
это смысл JPEG, а не беда
картинки, как и аудио позволяют сжатие с потерями.(MP3 сжатие с потерями, FLAC без)
Беда имеется ввиду для моей задачи ...
Что же касается сжатия с потерями/без,то BMP позиционируется как формат без сжатия, как такового. Если говорить о глубине цвета - то это уже другая история.
А по поводу музыки - формата без сжатия я не знаю.

Что же касается моей задачи - то вся эта чушь с шифрованием именно картинки предназначена для визуализации шифрования. Дальше картинки в этом смысле я пойти не смогу; во всяком случае создать информационный шум для музыкального проигрывателя я не смогу - знаний не хватит.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 04.08.2016, 19:53   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Но моя задача не решена: там, куда мне нужно пихнуть изображение - принимается только JPEG. И хоть ты сдохни. Где можно сделать JPEG "сжатие без потерь" ?

upd: что тут говорить - я потерялся ... Даже Adobe Photoshop CS6 не воспринимает BMP как изображение (файл не распознан) ... PNG читает, но при сохранении в JPEG так же жуёт этот файл до безобразия.
Что же, придётся ковырять JPEG побайтно, и шифровать только содержание, а не весь файл ...
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 04.08.2016 в 20:04.
OmegaBerkut вне форума Ответить с цитированием
Старый 05.08.2016, 00:03   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Проблему решил весьма по ламерски: взял картинку с расширением *.bmp, и просто поменял расширение на *.jpeg.
Куда надо загрузилось, и работает как надо.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 05.08.2016, 00:33   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

итого у вас BMP с неверным расширением, просто забудьте о JPEG, ваш алгоритм не рассчитан на потери.
JPEG даже при 100% качестве может в результате дать цвет на единицу в сторону
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.05.2017, 13:52   #10
Aleshka94
 
Регистрация: 17.05.2017
Сообщений: 4
По умолчанию

здравствуйте, можете поделиться пожалуйста программной реализацией?
Aleshka94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения. s-mumrik Visual C++ 3 12.04.2013 21:21
Компрессия BMP в JPG (JPEG) MartyM Общие вопросы C/C++ 2 25.11.2012 00:57
Работа с BMP -> JPEG MartyM Общие вопросы C/C++ 6 18.11.2012 14:07
Вопрос по OpenGL и *.bmp/*.jpeg файлам. Vova777 Мультимедиа в Delphi 2 26.06.2011 09:31
Проблема с TImage, BMP, JPEG Florento Общие вопросы Delphi 5 16.06.2011 16:18