sotvm
@sotvm
Умный поймёт, а дураку и так всё равно.

Как преобразовать любой файл в картинку png?

1) пусть 'вес файла в байтах' = b ,тогда 'размер квадратной картинки' r=√(b÷4) (округлим до большего целого)
количество байт делим на 4 (1-ый байт =Red ,2-ой =Green,3-ий =Blue,4-ый = Alpha) = это один пиксель.
2)создать картинку формата .png размером r x r
первый пиксель top-left (первые четыре байта исходного файла),
последний пиксель bottom-right (последние четыре байта исходного файла)
(если не хватило байтов из файла - оставляем FF или 00)
зы
ссылка на будущее (для себя)
строение PNG файла
  • Вопрос задан
  • 1106 просмотров
Решения вопроса 1
twobomb
@twobomb
Вот наляпал на C#
namespace ConsoleApplication1{
    class Program{
        static void Main(string[] args){
            var file = File.Open(@"D:\myfile.exe", FileMode.Open);
            var byteLen = file.Length;
            int size = (int)Math.Floor(Math.Sqrt(byteLen / 4));
            Bitmap bm = new Bitmap(size,size);
            for (int y = 0; y < size ; y++){
                for (int x= 0; x < size ; x++){
                    byte[] rgba = new byte[]{ 0xFF,0xFF,0xFF, 0xFF};
                    short cnt = 0;
                    while (cnt < 4 && file.CanRead){
                        byte[] buff= new byte[1];
                        file.Read(buff,0,1);
                        rgba[cnt++] = buff[0];
                    }
                    bm.SetPixel(x, y, Color.FromArgb(rgba[0], rgba[1], rgba[2], rgba[3]));
                }    
            }
            file.Close();
            var saveFile = File.Open(@"D:\myimg.png", FileMode.Create);
            bm.Save(saveFile,ImageFormat.Png);
            saveFile.Close();
        }
    }
}

Файл 907Кб

5e2eb0bfacc6c816460507.png

P.S. Сделал веб версию
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Автор пытается делать стеганографию. Тоесть в картинке скрывать информацию. Здесь выбор PNG полезен тем что инфа лежит плотно и в случае "гладкого" характера информации сжимается. Наподобие архиватора.

SVG - не подходит т.к. векторный и расточительный.
JPG - тоже не подходит т.к. повреждает информацию. Ее потом нельзя будет извлечь из файла без потерь.

По поводу дополнения файла до размера кратного длине строки (padding). Там не 00 не FF не подходит. Так как в оригинальном файле тоже могут быть эти константы и алгоритм даст сбой. Надо почитать как делается в криптографии. Там есть специальный workaround. Если его не реализовать правильно то при обратном декодировани картинки в файл мы можем получить ложное удлиннение файла на размер хвостика последней строки пикселов. Насколько это большой дэмедж для исходного файла - ХЗ. Но лучше конечно его не нелать чтоб обратное декодирование было надёжным с точки зрения длины файла.
Ответ написан
Griboks
@Griboks
Ну так в чём проблема? Открываете спецификацию png и генерируете по ней картинку. К сожалению, я знаю только формат jpeg, поэтому не могу конкретнее сказать про png.

Если говорим про jpg, тогда вам необходимо создать коэффициенты косинусов, закодированные через rle+хаффмана в каждом чанке. Для простоты можно взять готовое большое изображение и подменить имеющиеся чанки. Можно даже не декодировать коэффициенты, а тупо перезаписать уже сжатый код хаффмана. Тогда каждый байт вашего файла даст не 1/3, а, например, 10/3 пикселей.
Ответ написан
shambler81
@shambler81 Куратор тега Linux
используй формта svg
1. он читаемый как html, в добавок еще и CSS поддерживает и разобраться с ним будет не изи а просто совсем изи.
2. он растрово векторный
3. он поддерживается всеми браузерами.
4. он очень мало весит
5. имеет возможность прозрачности
6. может быть адаптивен.
7. можешь даже нарисовать что тебе нужно, и потом уже в коде заменить на переменные.
https://svg-edit.github.io/svgedit/releases/latest...
8. поддерживает как шрифты так и отдельные буквы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы