Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2015, 19:39   #1
DenIvan
 
Регистрация: 25.02.2015
Сообщений: 6
Сообщение Использование GDI+ в делфи 7. Необходимо через GDI+ в делфи 7 получить из файла формата jpg файл формата bmp

Всем здравствуйте. Необходимо через 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+. Пожалуйста, помогите кто чем может...
DenIvan вне форума Ответить с цитированием
Старый 26.02.2015, 19:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Думаю не нарушу ничего прикрепив то что использовал у себя.
Если мои коллеги сочтут прикрепленный файл нежелательным, скажи, вышлю на почту.
Вложения
Тип файла: rar GDIPlus.rar (103.6 Кб, 136 просмотров)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.02.2015, 20:33   #3
DenIvan
 
Регистрация: 25.02.2015
Сообщений: 6
По умолчанию GDI+

Спасибо, но теперь вот такие ругательства в модуле файла DirectDraw:

[Ошибка] DirectDraw.pas(173): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(180): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(190): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(197): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(209): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(590): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Ошибка] DirectDraw.pas(592): Type 'IDirectDrawSurface' needs finalization - not allowed in variant record
[Фатальная ошибка] DirectDraw.pas(5650): Could not compile used unit 'DXCommon.pas'
DenIvan вне форума Ответить с цитированием
Старый 26.02.2015, 21:12   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Про эту ошибку знаю, но не подскажу ничего.
По-моему я в местах этой ошибки прямо в исходниках строчки "рэмил", чтоб не всплывали. Чесслово, давно не работал с ним, просто не вспомню сейчас.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.02.2015, 21:25   #5
DenIvan
 
Регистрация: 25.02.2015
Сообщений: 6
По умолчанию GDI+

Извиняюсь что не богат в слэнге программеров. Что значит "рэмил" - выделял ошибку, переходил на строчку модуля и комментировал строку (//)? Или что-то другое?
DenIvan вне форума Ответить с цитированием
Старый 26.02.2015, 21:32   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Причина аксес виолейшена может крыться тут
Код:
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; 26.02.2015 в 21:45.
phomm вне форума Ответить с цитированием
Старый 27.02.2015, 10:40   #7
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Как верно заметил товарищ 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;
x128 вне форума Ответить с цитированием
Старый 27.02.2015, 11:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если понадобится TIFF стандартные скорее всего обломаются.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с JPG скрином C++ используя gdi+ Malriser Win Api 4 17.04.2015 13:41
Программа которая открывает файлы формата bmp и выводит содержимое файла на экран. zhenia312 Помощь студентам 1 13.06.2014 16:11
GDI\GDI+\Photoshop - как добиться прозрачности пикселей определенного цвета? STRELOK-2007 Мультимедиа в Delphi 12 11.01.2014 13:37
Mini Foto Redactor (Dev C++ WinAPI GDI+ Convert JPG to BMP and back) kachkarvv Софт 12 09.08.2012 10:26
Файл формата rtf как справка в делфи Грустная Помощь студентам 0 27.05.2012 11:24