Не могу никак понять, в чём дело. Пытался объясниться в чате на lazarus.freepascal.org, но мне там сказали, что picture это не bitmap и ничего работать не должно. Я в полном недоумении.
Предъистория: Lazarus 0.9.34, потом и 1.0 (win7 x64), кладу на форму image 1024x768, гружу в инспекторе объектов в picture jpg 1024x768.
После этого, получаю в программе цвета пикселей image1.Picture.Bitmap.Canvas.Colors[x, y] и использую brush, pixels, line, fillrect функции. Через некоторое время стал игнорироваться цвет со случайного места в программе, то есть до него, рисуется правильным цветом, а после него - только белый. При модификации прогрммы, это место куда-нибудь уплывает. Начал выкидывать всё из программы и пришёл к такому коду:
procedure TForm1.Button1Click(Sender: TObject);
var
y,z: integer;
begin
z:= image1.Picture.Bitmap.Height;//after that green color of a rectangle vanishes
Этот код рисует белый прямоугольник, если закомментировать строчку: зелёный. Если картинка не загружена, то белый - на белом фоне, зелёный - на чёрном фоне. В полной версии программы пробовал и image1.Picture.Bitmap.Canvas и image1.Canvas для рисования - никакого эффекта, цвет по фотошопу (240, 240, 240).
Пример с откомпилированным файлом доступен тут: http://www.fayloobmennik.net/2235548
Ткните меня, пожалуйста носом в мою ошибку.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
12-10-2012 05:18
Да, действительно, дело в картинке.
Оригинальный jpg - 24 бита
а так, всё в порядке. То есть, после загрузки 24 бит жепега, не важно каким способом, у него устанавливалась дурная палитра, которая и наследовалас в битмапы. Вот в этом и была вся засада. Наконец-то! :-)
Палитру можно и принудительно установить. Лучше работать с битмапами разрядностью pf32bit, pf24bit. В случае с TImage кто его знает, что там происходит при конвертации форматов и ассоциации с контекстами устройств - может, что-то и нарушается в процессе.
Прямое рисование в паинтбоксе, действительно, проходит замечательно, но что случилось с tbitmap переменной? Я так понимаю, что-то там с палитрой не то.
Выкиньте Вы этот TImage! Не предназначен он для рисования. Используйте TPaintBox.
Так я же теперь рисую в переменнной pic и только уже законченное изображение переношу в timage
Хорошо. Сделал Tpaint.Box, переношу туда тоже законченное изображение. В итоге, в тпаинте всё нарисованное отображенно белым, в тимаде всё нарисованное отображенно чёрным.
Рефреш пробовал везде - нулевой результат. Всё рисуется, и линии и точки и прямоугольники, но не тем цветом.
Сейчас плюнул, сделал assign временной переменной pic и все операции проводил с ней.
потом отображал это на канвас: Image1.Canvas.Draw(0,0, pic) программа полностью игнорит отображение. Хорошо, очистил картинку по умолчанию в image1, процесс - пошёл.
Только теперь всё рисует исключительно чёрным, не зарисорванные участки картинки выглядят нормальными.
Ну хорошо, пусть он заменяется битампом, пусть даже от картинки из jpg ничего не осталось, но в получившемс битмапе-то почему рисовать получается. но цвет белый?
Когда Вы грузите JPEG, в TImage.Picture содержится именно JPEG, битмапа в нем нет. После обращения к Picture.Bitmap производится конвертация JPEG в битмап, JPEG ликвидируется, заменяясь битмапом.
Попробуйте лучше отдельно грузить рисунок нужного формата, преобразовывать в TBitmap, и только потом запихивать в TImage.
P.S. Если пишите редактор, то TImage для него не подходит. Лучше постройте все на TPaintBox с буферизацией в отдельном битмапе.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.