PutImage

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

PutImage

Сообщение Герасим » 17.07.2015 21:51:08

Привет!
Проверял под Win7 и WinXP. Отправил сына учится на паскаль, принёс домой код типа работает... ан нет, погружаюсь в тему и ничего не выходит.
У меня FPC 2.4.0. пытаюсь с помощью модуля GRAPH вывести картинку из... например, image.bmp файла.
Для моего случая инет пестрит примерами типа:
Код: Выделить всё
procedure LoadBMP;
var f:file; bitmap:pointer; size:longint;
begin
   {$I-} Assign(f,'image.bmp'); Reset(f,1); {$I+}
   if (IOResult <> 0) then Exit;
   size:=FileSize(f);
   GetMem(bitmap,size);
   BlockRead(f,bitmap^,size);
   Close(f);
   PutImage(0,0,bitmap^,NormalPut);
   FreeMem(bitmap);
end;

Так вот, всякие граф примитивы (линии, текст, прямоугольники) выводит, а PutImage(0,0,bitmap^,NormalPut) НЕ РАБОТАЕТ!!!
хоть убейся!
я и делал image.bmp разных размеров (на мало ли) и сохранял его с разным кол-вом цветов и от 1бит до 32бит (естественно рассчитываю на 8 бит цветность) ни как не хочет появляться на экране.
и проверял указатели и загрузку файла.. всё норм.
Что может быть не так?
Герасим
новенький
 
Сообщения: 14
Зарегистрирован: 28.12.2007 13:29:18

Re: PutImage

Сообщение Mikhail » 18.07.2015 00:05:03

Герасим писал(а):Привет!
Проверял под Win7 и WinXP. Отправил сына учится на паскаль, принёс домой код типа работает... ан нет, погружаюсь в тему и ничего не выходит.
У меня FPC 2.4.0. пытаюсь с помощью модуля GRAPH вывести картинку из... например, image.bmp файла.
Для моего случая инет пестрит примерами типа:
Код: Выделить всё
procedure LoadBMP;
var f:file; bitmap:pointer; size:longint;
begin
   {$I-} Assign(f,'image.bmp'); Reset(f,1); {$I+}
   if (IOResult <> 0) then Exit;
   size:=FileSize(f);
   GetMem(bitmap,size);
   BlockRead(f,bitmap^,size);
   Close(f);
   PutImage(0,0,bitmap^,NormalPut);
   FreeMem(bitmap);
end;

Так вот, всякие граф примитивы (линии, текст, прямоугольники) выводит, а PutImage(0,0,bitmap^,NormalPut) НЕ РАБОТАЕТ!!!
хоть убейся!
я и делал image.bmp разных размеров (на мало ли) и сохранял его с разным кол-вом цветов и от 1бит до 32бит (естественно рассчитываю на 8 бит цветность) ни как не хочет появляться на экране.
и проверял указатели и загрузку файла.. всё норм.
Что может быть не так?


Не верный код, работать не будет. :) Вообще, такой простой способ подойдет только для 24-битных изображений, это во-первых. А во вторых, Вам нужно загрузить в память только данные изображения (растр). Смотрите формат bmp, например здесь https://ru.wikipedia.org/wiki/BMP. Проще говоря, Вам нужно пропустить заголовок. :wink:
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: PutImage

Сообщение Герасим » 20.07.2015 08:54:04

Ок, такого кода море в инете, могу привести десятки ссылок, когда подобным кодом прогеры пользуются и выводят картинки.
Надеюсь что Вы покажете тут мастер класс на темы:
1) как приготовить файл BMP для вывода через PutImage
1.1) количество цветов
1.2) палитра
1.3) максимально допустимый размер
1.4) прочие настройки графического редактора которые нужно установить при сохранении изображения в формате BMP чтобы данный BMP выводился через PutImage
2) Настройка параметров графического режима InitGraph (чтобы такой простой способ вывода картинок из BMP - работал)
3) И наконец правильный код:
3.1) правильная загрузка файла BMP c учётом смещений, заголовков
3.2) и наконец вывод на экран сформированного BMP
Герасим
новенький
 
Сообщения: 14
Зарегистрирован: 28.12.2007 13:29:18

Re: PutImage

Сообщение Снег Север » 20.07.2015 11:50:01

Герасим писал(а):Надеюсь что Вы покажете тут мастер класс

А кому оно надо? Люди, как правило, работают с изображениями через предназначенные для того компоненты.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: PutImage

Сообщение Лекс Айрин » 20.07.2015 12:25:05

Герасим, сколько было случаев, когда скопи-стыренный код без доработки напильником не работал... в Вашем случае, судя по уже указанным ссылкам, достаточно прочитать двойное слово по позиции $0a и прибавить его к этой позиции... данное число и будет размером заголовка. Ну а дальше просто считать данные с этой позиции. С учетом того, что это должен быть полноцветный рисунок.

Снег Север, кто-то же должен писать эти компоненты.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: PutImage

Сообщение Снег Север » 20.07.2015 12:29:14

Лекс Айрин писал(а):Снег Север, кто-то же должен писать эти компоненты.
Не спорю, но писать свои компоненты начинают разобравшись, для начала, с парой-тройкой чужих, а не после хэловорлда. При том, литературы по парсингу разных форматов изображений море, а сама эта задача отнюдь не столь тривиальная.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: PutImage

Сообщение Лекс Айрин » 20.07.2015 13:05:32

Снег Север, есть люди, которые осваивают все на хардкорной практике. Они не поленятся писать что-то сложное не изучая хелловолдов и куря при этом тонны разной литературы.

Да, литература есть, не спорю. (у меня, кстати, часть даже на смарте есть). А вот насчет чужих проектов... глянул я для справки в исходник FPC... чем что-то, на моем этапе, с ним делать проще написать заново. Сомневаюсь, что я смогу даже убрать оттуда что ненужное, пока не отреперю скользкие моменты собственными комментариями.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: PutImage

Сообщение Pavia » 20.07.2015 13:06:56

Пример известный тем что не работает. Дальше что!
Нужно разобрать файл формата *.bmp на составляющие и загрузить данные с полем Data(color-index array).
Если картинка хранится в несжатом виде то Data соответствует битовой картой.
Если данные сжатые, то надо разжать.

А вот после того как вы разбёрете BMP на составляющие их ещё надо преобразовать в формат Bitmap используемым в Graph.pas

Модуль Graph создан для обратной совместимостью с Borlan Pascal(turbo bascal) который поддерживал только разрешения с 256 цветами.
Поэтому
кол-вом цветов и от 1бит до 32бит
никак не подходят. Нужно сохранять как 8 битную картинку( с палитрой).

По поводу размера. Главное что-бы в память поместилась картинка. Не забываем что в Graph.Bitmap вначале указывается размер картинки, а после уже идёт индексная карта.
Код: Выделить всё
Record
width: Int32; // Целое знаковое 32 битное
height:Int32; 
Reserved:Int32
end;


Для обучения разбору(парсенгу) самое то.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: PutImage

Сообщение Снег Север » 20.07.2015 13:10:22

Лекс Айрин писал(а):проще написать заново
Флаг в руки и ...ну и всё прочее... :P
Я же крайне ленив и писать свои велосипеды сподобливаюсь только при жесточайшей необходимости, а во всех прочих случаях стараюсь обойтись готовеньким. :wink:
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: PutImage

Сообщение Лекс Айрин » 20.07.2015 13:13:41

Снег Север, там не совсем велосипед. Некоторые отличия в операторах точно будут.Так что готовеньким по любому не так просто обойтись.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: PutImage

Сообщение Снег Север » 20.07.2015 13:38:43

Pavia писал(а):Для обучения разбору(парсенгу) самое то.
Может быть, конечно... Но в эпоху 64-битных ОС выводить изображения дос-овскими средствами... ИМХО - мазохизм.

Лекс Айрин писал(а):Снег Север, там не совсем велосипед. Некоторые отличия в операторах точно будут.Так что готовеньким по любому не так просто обойтись.
Так я ничо... вам виднее...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: PutImage

Сообщение Лекс Айрин » 20.07.2015 13:57:04

Снег Север, так нет смысла тупо переписывать под себя -- это уж точно велосипед будет.

Снег Север писал(а): Но в эпоху 64-битных ОС выводить изображения дос-овскими средствами... ИМХО - мазохизм.


Вообще-то не все низкоуровненые средства ДОСовские. Есть, как минимум, порт под Линукс... плюс, есть куча приложений для консоли под виндовс.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: PutImage

Сообщение Снег Север » 20.07.2015 14:10:18

Лекс Айрин писал(а):Вообще-то не все низкоуровненые средства ДОСовские. Есть, как минимум, порт под Линукс... плюс, есть куча приложений для консоли под виндовс.
Опять ИМХО, но консоль никак не для вывода изображений, она для текста. А для изображений - графическая оболочка и средства работы в ней.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: PutImage

Сообщение Лекс Айрин » 20.07.2015 14:22:02

Снег Северну.... а с чего Вы это взяли? Под линуксом тоже можно выводить изображения в текстовой консоли...например, некоторые дистры так выводят свой логотип. Да и не всегда нужно запускать тяжелый оконный менеджер. Очень многое делается в консоли, благо в линуксе их 6 текстовых. Да и, допустим, игры часто требуют полного экрана. И не всегда для них требуется поддержка графического ускорения.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: PutImage

Сообщение Герасим » 20.07.2015 14:22:49

Снег Север писал(а):Но в эпоху 64-битных ОС выводить изображения дос-овскими средствами... ИМХО - мазохизм.

Я написал в старте топика, что дети учатся прогать в летней школе. Алгоритмы они вечны, вот они их и учат на пример создания простейших игр.
Я вот папа такого ученика.
Сына приносит домой из школы:
1) исходник, в котором с помощью файла bmp и PutImage, картинка передвигается.
2) скомпилированный в школе (из этого исходника) EXE-файл
Дома:
1) запускаем EXE принесённый из школы - работает ("динозавр бегает")
2) компилим исходник на домашних компах (параллельно при отладке убеждаемся, что картинку программа находит и загружает), переходит в граф режим, граф. примитивы вроде Circle отрисовываются, но PutImage НЕ РАБОТАЕТ!
Вот это меня и озадачивает. У школоты в школе PutImage работает, но дома нет.
В чём различия:
1) Школота работает под виртуальной машиной (Windows Virtual PC) чтобы не нашкодили. FPC 2.4.0.
2) Дома мы компилим на FPC 2.4.0. и FPC 2.6.4. Операционки W7x64 и WXP32. FPC+IDE скаченный с freepascal.org
Какие у Вас могут быть предположения?
Герасим
новенький
 
Сообщения: 14
Зарегистрирован: 28.12.2007 13:29:18

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru