Только вот боюсь, добавление директивы на подключение PABCSystem.pcu сильно ухудшило размеры файла модуля (откомпилированного).
- чтоб нумерация не ломалась.
- Я про
System.Math.Truncate
,System.Math.Ceiling
иSystem.Convert.ToInt32
которые используетPABCSystem
вInt
иRound
. Вы же используете более низкоуровневые имена какSystem.byte
вместоbyte
, которые на производительности не влияют, так зачем вы добавляете лишний уровень рекурсии, который как раз уже влияет. - И? С их структурой запись отдельной составляющей цвета и т.п. будет не эффективна но у вас то что мешает?
- Да, вот только попробуйте убрать эту строчку - ничего компилироваться не перестанет.
- Я знаю зачем это, но ваш модуль не для запуска графического окна а для операций. Он может использоваться не только в графической программе, а к примеру в утилите преобразующей 1 файл к другому, поэтому я и называю это навязыванием. Те кто будут пользоваться или используют эту строчку в своей программе, или подключат
GraphABC
и т.п. - Вы сначала записываете, по пиксельно(хотя бы уже массив байт в него пихали а не так, попиксельная запись в
Bitmap
ужасно медленная), а потом уже даёте битмапу записать своё содержимое в файл. Поэтому он посредник, нормальный способ записи включает запись в файл заголовка соответственно формату, и после этого запись туда же каждого пикселя картинки. - Если вы протестировали уже - хорошо.
- С Crtl+F поищите
= True
- там оно много раз попадается. - чтоб нумерация не ломалась.
- Вы хотя бы посмотрите тип возвращаемого значения - integer.
System.IO.FileStream
совершенно не оптимизировано для побайтового чтения. Кроме того посмотрите на возможностиSystem.IO.BinaryReader
иSystem.IO.BinaryWriter
, там много полезного для запаковки стандартных типов в файл. Как раскладываниеSingle
на 4 байта и запись их в поток, и такое же считывание.
Хотелось ещё кое что объяснить, System.Drawing.Bitmap
не содержит просто массив байт, там очень сложная структура, поэтому чтение и запись медленнее чем у массива байт, ну и ваших типов тоже. Разница в 160 раз на чтение одного байта между массивом и битмапом, вот программа которой я тестировал. И поэтому же невозможно так легко перезаписать одну составляющую цвета одного пикселя.
И ещё, ваш модуль содержит только подпрограммы для обработки данных, эта обработка может запускаться несколько тысяч раз в секунду, поэтому я так яро борюсь за оптимизацию))).
Имена не могут быть низкоуровневыми. Низкоуровневыми могут быть только компоненты. Рекурсии там никакой нет. Использую PABCSystem только потому, что его пока-что (надеюсь, что разработчики всё-таки это исправят) нельзя отключить.
Какой в этом смысл? Зачем это нужно? Чем плох GetPixel()?
Но и с ней всё компилируется!
По видимому, Вы меня не правильно поняли. Тип приложения можно заменить на свой. То есть, если модуль консольный, то его совершенно спокойно можно использовать и в графическом режиме. Пример - преславутый PABCSystem, он консольный, всегда добавляется к программам и библиотекам, но это не мешает написать в программе {$AppType Windows}
и пользоваться Windows-программой. Так и наоборот, если написать (или не написать ничего о типе приложения, так как в Паскале тип приложения по умолчанию-консольный) {$AppType Console}
в программе, использующей GraphABC, будет консольный режим (Графическое окно и консольное одновременно), так как WindowsForms всё же немного дружит с консолью. Так что выбор здесь полностью Ваш.
В упор не понимаю, о чём Вы говорите! Может Вы приведёте код? Сохранить изображение в LAB и XYZ в файл можно не только через Bitmap, но и в специальном формате, разработанном для каждого класса. Это реализовано в виде массива байт и потоков. Если Вам так хочется обходиться без ООП, то можете просто взять и скопировать методы перевода цвета в свою программу, исходный код модуля будет в инсалляторе Паскаля, лицензия также это позволяет. Тогда можете писать всё в виде массива байт, но я очень сомневаюсь, что этот код сможет прочитать кто-то, кроме Вас.
В среде разработки должны быть примеры (уверен, что Вы знаете, где они лежат). Находите там папку OMP Samples и изучаете примеры. Среди них есть параллельное перемножение матриц с помощью {$OMP Parallel For}
(сравнение скорости выполнения с параллельным циклом и без него). Собственно, здесь задача похожая.
В таком случае в следующей версии (дней через 5) я это поправлю. Тут Вы скорее всего правы.
Это я тоже знаю. Но ведь иногда чем-то приходится жертвовать. Понятно, что работа с массивом байт будет быстрее, чем со сложной структурой типа bitmap, но чтобы так работать нужно иметь большой опыт работы и немало времени, поэтому и сделано всё таким образом. Но хотел бы заметить, bitmap и color устроены гораздо сложнее, чем мои классы и структуры, они содержат больше информации.
Если Вы открывали код моего модуля, то увидели бы, что там, помимо методов, ещё и куча классов и структур, описывающих все изображения и цвета (во всех пространствах). Я тоже борюсь за оптимизацию, но не будем забывать, что иногда задача требует не оптимизации, а понятного кода, который ,увы, крайне трудно сделать, используя только массивы. Так же хотел бы попросить показывать примерный код того, что Вы предлагаете. По словам ориентироваться очень трудно.
Это много конечно
А вот модель HSV - она присутствует?
И почему не использовать стандартный тип Color для RGBColor?
Мы ещё раз повторим, что сделать это невозможно - после отключения системного модуля работать в оболочке с кодом невозможно. Кроме того, если это модуль, а не dll, то такое отключение вообще не имеет смысла, поскольку на размер результирующего файла не влияет.
Скоро добавлю.
Сделал тип только для того, чтобы он был в формате, общем для библиотеки. При сохранении в файл соответствующего изображения, используются стандартные форматы (jpg, bmp), на выбор. Для этого есть перечисление.
Проблема в том, что в любом случае результатом работы будет dll или exe, где размер будет.
В чём заключается проблема? Чего кроме стандартных типов, классов и подпрограмм не будет? Может, если с отключением всё так плохо, тогда сделать две версии модуля, первая содержит только самое необходимое, а вторая-то что есть сейчас? Почему Паскаль обязательно должен иметь какое-то нехорошее свойство? Обидно.
Обновление для библиотеки. Добавлено цветовое пространство CMYK (Пока работает с некоторыми погрешностями). Добавлен класс Graphics (пока только конструктор и метод для установки цвета пиксела). Добавлен новый класс исключения. В ближайшие два дня добавлю HSV.ColorSpaces.pas (71,4 КБ)
Как и обещал, обновление для библиотеки:blush::
- Добавлено цветовое пространство HSV.
- Graphics’ы решил сделать отдельными для каждого цвет. пространства, что бы увеличить производительность.
- Класс исключения, добавленный в предыдущей версии сохранил(может в дальнейшем пригодиться).
- Добавлен системный метод для конвертирования RGB в HSL. Может, завтра добавлю всё пространство. Файлы: Исходник: ColorSpaces.pas (89,0 КБ) Откомпилированный: ColorSpaces.pcu (182,9 КБ) Описание (XML): ColorSpaces.xml (35,9 КБ)
Если уж будет по графиксу на битмап, может добавить битмапам функцию типа GetGraphics
? К примеру чтоб можно было в записи
var b := new RGBBitmap(5,5);
var gr := b.GetGraphics;
менять тип только для b
, а переменной gr
он автовыведится. Этот примеру простенький, но в разных подпрограммах может быть свой gr
.
Хорошая идея! Попробую реализовать.
В принципе, если будут добавлены пространства имён, можно будет “разделить” библиотеку на логические части: на каждое цветовое пространство-своё пространство имён. То есть в пространстве имён RGB будет RGBBitmap; RGBColor; RGBGraphics. Добавить пространство имён с конвертерами для цветов и изображений… Будет удобнее, чем искать нужное имя среди пары десятков других. Надеюсь, Разработчики сделают их в ближайшее время. Очень полезная конструкция.
Итак, обновление для библиотеки цветовых пространств:
- К каждому цветовому пространству добавлен свой класс Graphics(поверхность рисования). В классы Bitmap добавлены методы CreateGraphics для получения экземпляра класса Graphics для текущего изображения. В классах Graphics реализовано: 1.1 GetPixel(x, y: System.Int32): ***Color; 1.2 SetPixel(x, y: System.Int32; C: ***Color); 1.3 DrawRectangle(x1, y1, x2, y2: System.Int32; C: ***Color); 1.4 FillRectangle(x1, y1, x2, y2: System.Int32; C: ***Color); 1.5 DrawEllipse(x1, y1, x2, y2: System.Int32; C: ***Color); 1.6 DrawEllipse(x1, y1, x2, y2: System.Int32; Density: System.Int32; C: ***Color); 1.7 DrawLine(x1, y1, x2, y2: System.Int32; C:***Color); Файлы: Исходный код: ColorSpaces.pas (123,9 КБ) Описание (XML): ColorSpaces.xml (49,2 КБ) Откомпилированный: ColorSpaces.pcu (312,5 КБ) В следующей версии реализую цветовое пространство HSL и расширю возможности Graphics. Версию добавлю в течение 3-х дней.