Всем добрый день!
Вдохновившисьодной gif-кой я решил, а что будет, если написать обратное приложение и смотреть на «карту» кода?
Во первых нам необходимо решить задачу «разместить столько то пикселей в квадрат».
Понятно, что в квадрат не всегда можно да и не нужно. Поэтому можно расположить их в прямоугольник с дополнением.
Не найдя алгоритма, который мне скажет, что 129=11*12-3, я решил его написать сам.
После чего рисуем красивую картинку или в поток или в файлик.
Примеры получившихся картинок:
Код в среднем равномерно-серый с вкраплениями зеленого. Зато, полосатый.
Исполняемый файл какой-то странный, с черной полосой посередине.Что, в общем-то, очевидно.
В конце угадываются ресурсы иконок.
Примеры получившихся картинок:
Код в среднем равномерно-серый с вкраплениями синего. В целом, он кажется синеватым.
В общем, экспериментируйте, надеюсь, ваш код не окажется равномерно-коричневого цвета!
Исходник в архиве
Скомпилированная программа
P.S. Если вдруг знаете красивый алгоритм превращения числа в произведение с остатком — очень прошу мне про него рассказать.
Вдохновившись
Во первых нам необходимо решить задачу «разместить столько то пикселей в квадрат».
Понятно, что в квадрат не всегда можно да и не нужно. Поэтому можно расположить их в прямоугольник с дополнением.
Не найдя алгоритма, который мне скажет, что 129=11*12-3, я решил его написать сам.
Немного ужасного кода
public static ImageSize Generate(uint PixelsCount, double MaximumDeltaPercent=1f, uint MaximumAbsoluteDelta=10, double MaximumAspectRatio=1.77) { //check if this is empty image if (PixelsCount==0) return new ImageSize(1,1); //check if this is a square double sqrt = Math.Truncate(Math.Sqrt(PixelsCount)); if (Math.Pow(sqrt, 2) == PixelsCount) return new ImageSize((ushort)sqrt, (ushort) sqrt); //Путем тестов выяснено, что AspectRatio - штука, работающая на достаточно больших числах. Поэтому на маленьких мы ее отключаем. if (PixelsCount<=10) MaximumAspectRatio = double.MaxValue; double percentdelta = PixelsCount/(MaximumDeltaPercent*100); uint height = (ushort) Math.Truncate(Math.Sqrt(PixelsCount)); uint width = (ushort) (height+1); while (width/(height*1.0f)<MaximumAspectRatio) { ulong Result = width*height; if (Result==PixelsCount) { if (width<=ushort.MaxValue && height<=ushort.MaxValue) { return new ImageSize((ushort) width, (ushort) height); } } if (Result>PixelsCount) { if ((Result-PixelsCount)<=percentdelta || Result-PixelsCount<=MaximumAbsoluteDelta) { if (width <= ushort.MaxValue && height <= ushort.MaxValue) { return new ImageSize((ushort) width, (ushort) height); } } height--; continue; } if (Result < PixelsCount) { width++; } } throw new Exception(string.Format("Невозможно создать красивую картинку размером {0} пикселей с таким Aspect Ratio. Попробуйте большее значение\nОтладочная информация: PC:{0} MDP:{1} MAD:{2} MAR{3}",PixelsCount,MaximumDeltaPercent,MaximumAbsoluteDelta,MaximumAspectRatio)); }
После чего рисуем красивую картинку или в поток или в файлик.
Примеры получившихся картинок:
Один из больших файлов моего мини-проекта
Код в среднем равномерно-серый с вкраплениями зеленого. Зато, полосатый.
Explorer.exe из Win8.1
Исполняемый файл какой-то странный, с черной полосой посередине.
В конце угадываются ресурсы иконок.
Примеры получившихся картинок:
Workqueue.c из linux kernel
Код в среднем равномерно-серый с вкраплениями синего. В целом, он кажется синеватым.
В общем, экспериментируйте, надеюсь, ваш код не окажется равномерно-коричневого цвета!
Исходник в архиве
Скомпилированная программа
P.S. Если вдруг знаете красивый алгоритм превращения числа в произведение с остатком — очень прошу мне про него рассказать.
