Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
15th
Июл
Использование GDI+ в делфи 7. Необходимо через GDI+ в делфи 7 получить из файла формата jpg файл формата bmp
Posted by obzor under Delphi, Архив, Топик-обзор
Необходимо через GDI+ в делфи 7 получить из файла формата jpg файл формата bmp. Скачал архив с GDI+, распаковал и положил 6 файлов (DirectDraw.dcu, GDIPAPI.dcu, GDIPUTIL.dcu, GDIPOBJ.dcu, DirectX, Jedi) в каталог Lib, где стоит делфи. Потом когда я получил ошибку — скопировал эти же файлы и в проект (на всякий случай), но не помогло. Пишу код:
uses
Windows, ... jpeg, pngimage, GifImage,
GDIPAPI, GDIPOBJ, GDIPUTIL;
procedure TForm1.Button3Click(Sender: TObject);
var
encoderClsid: TGUID;
Image: TGPImage;
begin
Edit1.Text:=StringReplace(Edit1.Text,ExtractFileExt(Edit1.Text),'',[]);
if ExtractFileExt(Edit1.Text)='.jpg' then
Image := TGPImage.Create(Edit1.Text+'.jpg');
GetEncoderClsid('image/bmp', encoderClsid);
image.Save(Edit1.Text+'.bmp', encoderClsid, nil);
image.Free;
Image2.Picture.LoadFromFile(Edit1.Text+'.bmp');
end;
При запуске сначала появляется такое предупреждение
[Предупреждение] Unit1.pas(98): Variable ‘Image’ might not have been initialized
А затем вылазеет ошибка вот в таком окне:
—————————
Debugger Exception Notification
—————————
Проект Capcha.exe вызвал исключение класса EAccessViolation с сообщением ‘Access violation at address 7C80980F in module
‘kernel32.dll’. Write of address CED6E8D3′. Процесс остановлен. Используйте Шаг или Запуск для продолжения.
—————————
OK Help
—————————
Жму ОК, выскакивает окно:
Исходник не найден GDIPOBJ.pas
Путь к файлу: GDIPOBJ.pas
Да, действительно файла GDIPOBJ.pas нет ни в папке с проектом, ни в папке Lib где стоит делфи. В то время как GDIPOBJ.dcu есть в обоих папках. Сам не знаю что думать: то ли делфи не создал GDIPOBJ.pas, то ли этот файл должен был войти в состав скачиваемого GDI+.
Причина аксес виолейшена может крыться тут
if ExtractFileExt(Edit1.Text)='.jpg' then
Image := TGPImage.Create(Edit1.Text+'.jpg');
как видим, ифка отрабатывает и действует на 1 строку — создания имеджа, если ифка не отрабатывает, то после этих строк переменная image ссылается на мусор (не вызывался конструктор) и работа с мусорным указателем приведёт к АВ (о чём и намекает ворнинг), тривиальное решение — засунуть всю пачку конвертирующего кода в бегин-энд после ифки.
Плюс надо бы проверить под дебагом, что за расширение возвращается.
То что пишет, что файл не найден, дак тут всё как и должно быть — среда пытается показать строку в файле с кодом, начиная с которой процесс пришёл к АВ, но поскольку она лишь знает номер строки (читая из dcu взаимосвязи бинарного кода и строк исходника), её попытка открыть несуществующий пас-файл проваливается.
Но к делу это не относится, это лишь следствие.
ПС. отвечу за Stilet’a. ремил это значит комментировал, от команды rem из «языка» командной строки, команда эта делает нерабочей строку после неё до перевода строки, т.е. работает как комментарий.
Крамольный вопрос спрошу — на кой ляд Вам GDI+, когда обычный Assign жпеговского объекта в битмаповский объект позволяет конвертировать графику (в сети мульён копий этого простого кода) ?
ПС. Отвечу за Stilet‘a. ремил это значит закомментировал, от команды rem из «языка» командной строки, означающей исключение последующего текста до перевода строки из обработки процессором команд, что по сути есть комментирование.
ПС2. ошибки из директдровного модуля скорее всего сводятся к такой сути — в рекордах с указанием case нельзя использовать «большие» строки (string, ansistring) и динмассивы. Возможно, не совсем корректный перевод с с++ или не учтены какие-то инклюды/директивы.
Как верно заметил товарищ phomm, GDI+ тут лишний.
uses
jpeg, pngimage, GifImage;
...
var
bmp: TBitmap;
begin
bmp:=TBitmap.Create;
with TPicture.Create do begin
LoadFromFile(.....); //jpg,png,gif,bmp
bmp.Assign(Graphic);
Free;
end;
bmp.SaveToFile('image.bmp');
bmp.Free;
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)