![]() |
|
|
#1
|
||||
|
||||
|
Всем привет!
Решил свою несложную игру научить сохранять скриншоты в формате PNG. Нашел дельфийские модули по работе с этим форматом, исправно выполняют свое дело. Но, увы, в них почти 7000 строк кода, а это чуть не 1/3 от всей моей игры; компиляция заметно затягивается. Решил написать DLL-ку, которая использует модуль PNGImage и экспортирует функции взаимного конвертирования BMP - PNG. Выглядит это примерно так: Код:
{...}
uses PNGImage;
{...}
function BMPtoPNG(const BMP: pBitmap): pPNG;
var PNG: TPNGObject;
begin
PNG:=TPNGObject.Create;
try
PNG.Assign(BMP^);
finally
Result:=@PNG;
end;
end;
{...}
exports BMPtoPNG;Проблемы это не решило, так как в программе все равно приходится объявлять тип pPNG, ссылающийся на TPNGObject (а он описан в массивном модуле на тысячи строк)... Код:
type pPNG = ^TPNGObject; pBitmap = ^TBitmap; function BMPtoPNG(const BMP: pBitmap): pPNG; external 'pngimg.dll'; К тому же, попытка конвертирования приводит к Access Violation. Видимо, я неправильно использую указатели? А раз нужно объявлять ссылку на TPNGObject, то весь модуль PNGImage будет все равно добавлен в код и откомпилирован, и тогда нет смысла биться над DLL-библиотекой... Есть решение у этой проблемы? Или не париться, выкинуть все модули для PNG и спокойно сохраняться в BMP или JPEG? |
|
#2
|
||||
|
||||
|
Честно говоря, ошибка здесь:
Цитата:
Цитата:
По проблеме: Я бы сделал так: Код:
procedure BMPtoPNG(BMP: TBitmap; Path: PChar); З.Ы. А вот это здравое решение: Цитата:
Последний раз редактировалось M.A.D.M.A.N., 21.01.2017 в 08:46. |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Lothlorien (21.01.2017)
| ||
|
#3
|
||||
|
||||
|
Попробую сохранять сразу в файл; если надоест ковыряться, то и правда выкину весь геморрой и буду по старинке делать JPEG )
|
|
#4
|
|||
|
|||
|
И самое главное. Когда создаёшь проект типа DLL, Дельфи пишет в файле проекта длинный коментарий. Внимательно читаем.
|
|
#5
|
|||
|
|||
|
Цитата:
А еще помним, что DLL.TObject <> App.TObject, сооьветственно, DLL.TBitmap <> App.TBitmap. Поэтому в такую функцию лучше передавать либо HBitmap. Ну и путь к файлу как PChar. Тогда, кстати, можно будет подобные DLL писать на любом языке. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Lothlorien (01.02.2017)
| ||
|
#6
|
||||
|
||||
|
Передаю как аргумент хэндл битмапа (hBITMAP), процедура из библиотеки сразу же сохраняет готовый PNG в указанный файл. Так все работает, спасибо за помощь!
|