Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.01.2017, 05:49
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию Проблема с DLL

Всем привет!

Решил свою несложную игру научить сохранять скриншоты в формате 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?
__________________
Ne timeas obscurum.
Ответить с цитированием
  #2  
Старый 21.01.2017, 08:37
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Честно говоря, ошибка здесь:
Цитата:
Сообщение от Lothlorien
Нашел дельфийские модули по работе с этим форматом, исправно выполняют свое дело. Но, увы, в них почти 7000 строк кода, а это чуть не 1/3 от всей моей игры; компиляция заметно затягивается.
И здесь:
Цитата:
Сообщение от Lothlorien
Решил написать DLL-ку

По проблеме:
Я бы сделал так:
Код:
procedure BMPtoPNG(BMP: TBitmap; Path: PChar);
т.е. сразу бы передавал в ф-ю строку куда сохранять скрин. Ну и проверь, что pBitmap в длл и в твоем коде одного и того же типа.

З.Ы. А вот это здравое решение:
Цитата:
Сообщение от Lothlorien
Или не париться, выкинуть все модули для PNG и спокойно сохраняться в BMP или JPEG?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 21.01.2017 в 08:46.
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Lothlorien (21.01.2017)
  #3  
Старый 21.01.2017, 12:16
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Попробую сохранять сразу в файл; если надоест ковыряться, то и правда выкину весь геморрой и буду по старинке делать JPEG )
__________________
Ne timeas obscurum.
Ответить с цитированием
  #4  
Старый 23.01.2017, 09:36
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

И самое главное. Когда создаёшь проект типа DLL, Дельфи пишет в файле проекта длинный коментарий. Внимательно читаем.
Ответить с цитированием
  #5  
Старый 23.01.2017, 09:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от icWasya
И самое главное. Когда создаёшь проект типа DLL, Дельфи пишет в файле проекта длинный коментарий. Внимательно читаем.

А еще помним, что DLL.TObject <> App.TObject, сооьветственно, DLL.TBitmap <> App.TBitmap. Поэтому в такую функцию лучше передавать либо HBitmap. Ну и путь к файлу как PChar. Тогда, кстати, можно будет подобные DLL писать на любом языке.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Lothlorien (01.02.2017)
  #6  
Старый 01.02.2017, 21:03
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Передаю как аргумент хэндл битмапа (hBITMAP), процедура из библиотеки сразу же сохраняет готовый PNG в указанный файл. Так все работает, спасибо за помощь!
__________________
Ne timeas obscurum.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter