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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2008, 05:49
Аватар для Zander_driver
Zander_driver Zander_driver вне форума
Прохожий
 
Регистрация: 07.03.2008
Сообщения: 29
Репутация: 10
По умолчанию Обьясните с TBitmap

Здравствуйте. Ситуация такая: обьявляю глобальную переменную TBitmap, как полагается создаю ее через Create, потом LoadFromFile из bmp-файла, потом на ее канве рисую разные вещи, потом вывожу ее на канву формы с помощью метода Draw.
Проблема вот в чем: если программе предлагается bmp-файл, созданный в "Пайнте" то все работает без всяких проблем. Если же файл создан в фотошопе (расширение то же самое - bmp, 24 бита, windows) то программа выдает ошибку "Stream read error" при попытке загрузить изображение из файла. Обьясните мне пожалуйста, почему так выходит? может надо что-то в код дописать для лучшей читаемости bmp или в фотошопе какую опцию сохранения включить?
Ответить с цитированием
  #2  
Старый 23.11.2008, 21:58
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

(предыдущее сообщение игнорируем...)

Если я напишу:
var image:TBitmap;
...
image:= TBitmap.Create;
Image.LoadFromFile('moon.bmp');
...

То битмап где окажется, в озу(оперативной памяти) или в видео памяти?
Ответить с цитированием
  #3  
Старый 23.11.2008, 23:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. В ОЗУ, кстественно.
2. По предыдущему вопросу. BMP - это общий формат (контейнер). Там может быть несколько внутренних форматов, какие-то из которых нативно могут и не поддержтваться. Напримет, маковский битмап.
Ответить с цитированием
  #4  
Старый 24.11.2008, 08:30
Аватар для :S.p.a.m.
:S.p.a.m. :S.p.a.m. вне форума
Активный
 
Регистрация: 04.05.2008
Сообщения: 260
Репутация: 15
По умолчанию

По поводу первого поста. Тоже с этим сталкивался. Взял отключил гдето флаг "сглаживание" (не при сохранении, вроде бы) и все заработало. А вообще я просто беру и ACDSee перевожу из BMP в BMP просто и все норм читается.
Ответить с цитированием
  #5  
Старый 24.11.2008, 13:34
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

А как узнать цвет пикселя, допустим в точке (5,1) ?
Ответить с цитированием
  #6  
Старый 24.11.2008, 13:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если считать один пиксел, то так: bmp.Canvas.Pixels[X,Y].
Если надо считывать всю картинку (для реализации граф. фильтра, например), то через ScanLine
Ответить с цитированием
  #7  
Старый 24.11.2008, 16:58
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

1. Допустим, у нас есть значение векторов Z,X,Y, как наложить НА НИХ текстуру?(в OpenGL)
2. Как масштабировать битмап?(в сторону уменьшения)

P.S. Извеняюсь за 2-ой пост. Нажал вместо кнопки "Править" kнопку "цитата".
Ответить с цитированием
  #8  
Старый 24.11.2008, 17:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

C OpenGL не работал, а по поводу уменьшения все просто.
Есть у канвы функция StretchDraw, которая отрисовывает битмап с масштабированием. Тебе надо только расчитать облась, на которую надо отмасштабировать картинку. Можно еще "накопать" функций, которые умеют масштабировать со сглаживанием, но тут надо понимать, что они будут работать медленнее. Т.е. если тебе нужна скорость - обращаешься к API, если качество - к другим процедурам. Кстати, в OpenGL, наверное, есть свои методы для масштабирования текстур.
Ответить с цитированием
  #9  
Старый 24.11.2008, 21:30
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

"StretchDraw, которая отрисовывает битмап с масштабированием"

Не надо отрисовывааааааааэээээээээээээть!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!
просто уменьшить (или увеличить) и сохранить в память.

Последний раз редактировалось DungeonLords, 24.11.2008 в 21:33.
Ответить с цитированием
  #10  
Старый 24.11.2008, 23:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не надо столько кричать

Отрисовать можно и на канве друго TBitmap

Просто создаешь еще один битмап, ставишь ему размеры и на его канве с помощью StretchDraw отрисовываешь свой! На экран при этом, естественно, ничего не выводится
Ответить с цитированием
  #11  
Старый 25.11.2008, 15:15
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Как перейти на другую сторону Каспийского озера, не намочившись - воспользоваться обходным путём!(ирония, если обходить Каспийское озеро по суше, затратишь куда больше времени! Так и тут!)
Ответить с цитированием
  #12  
Старый 25.11.2008, 15:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Иронию не понял. Т.е. сама тема понятна, но ее отношение к ситуации - нет. Есть просто термин - "отрисовка". Он относится не только к выводу на экран, а к любой отрисовке на канве (на самом деле, на DC), а уж экранная это канва или нет - дело десятое. Преобразование картинок - в своем большинстве устроенно именно так - мы читаем из оригинала данные и, обработав их, записываем в другую картинку. Потом первую просто "убиваем" и дальше работаем со второй.
Ответить с цитированием
  #13  
Старый 25.11.2008, 21:43
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Есть процедура Pixels[x,y];.
И она выдаёт цвет пикселя в числовом значении. Но порой это значение - 0, а порой - 52342000(это наблюдается и в 16 битных, и в 32 битных битмапах). Можно ли как-нибудь уменьшить чёткость восприятия процедуры?
Ответить с цитированием
  #14  
Старый 28.11.2008, 11:08
delphik delphik вне форума
Прохожий
 
Регистрация: 27.11.2008
Адрес: Volgograd
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от DungeonLords
А как узнать цвет пикселя, допустим в точке (5,1) ?

Попробуй так:
var
Col : TColor;
X, Y : Integer;
begin
X:=1; Y:=5;
Col := Image1.Canvas.Pixels[X, Y];
end;
Ответить с цитированием
  #15  
Старый 21.12.2008, 12:00
1o1man 1o1man вне форума
Прохожий
 
Регистрация: 21.12.2008
Адрес: в квартире
Сообщения: 3
Репутация: 10
По умолчанию

procedure TForm1.pastebutClick(Sender: TObject);
var
Bitmap: TBitmap; HasFormat: boolean;
begin
if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Bitmap.Assign(Clipboard) ;
end;

ругается на это((( 'TBitmap' does not contain a member named 'HasFormat'
и где взять такую штуковину, ну, в общем прямоугольник выделения? клипбоард в юзес добавил
ищю ищю, найти не могу(
зы. я делаю пеинт. вот там надо копировать\вырезать вставить. вроде процедурки ввел эти, а когда жму на кнопку то ошибка.((( хелп!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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