TImage

Вопросы программирования и использования среды Lazarus.

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

Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

TImage

Сообщение vitaly_l »

var
image : TImage;

Код: Выделить всё

  image[1].Picture.LoadFromFile('box.png');
  for x := 5 to 55 do
       for y := 5 to 55 do
           image[1].Picture.Bitmap.Canvas.Pixels[x,y] := clRed; //<=== здесь сбой... вместо красного рисует прозрачным...



  image[2].Picture.LoadFromFile('box.png');
  for x := 0 to image[2].Height do
       for y := 0 to image[2].Width do
           image[2].Picture.Bitmap.Canvas.Pixels[x,y] := clRed; //<=== а здесь рисует нормально...


:!: Требуется, чтобы "рисовал" от 5 до 55...
:!: однако: image - рисует правильно только когда от 0 до Height...Width, а в остальных случаях делает прозрачным
:!: Вот ещё важно, изначально в image загружен *.png с прозрачностью

:?: :arrow: Вопрос: Как это реализовать??? и в чём подвох?!

В аттаче код и project1 lazarus.

PS: (кстати у TImage точно такие же проблемы с прозрачностью, если накладывать на изображение CopyRect или BitBlt или StretchDraw)


.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Возможно дело в режиме рисунка, вы ставите точку на image , а надо ставить внутри на самом битмепе, может сделать assign на TBitmap и с ним работать
И еще у вас png , это не родной формат для лазаруса

Код: Выделить всё

 b:TBitmap;
begin           
b.Assign(image[0].Picture.Bitmap); 
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Странно, возникают закономерные вопросы...:
изначальный image[0].Picture.Bitmap и предлагаемый b:TBitmap - разве не одно и тоже???

Ism писал(а):png , это не родной формат для лазаруса

Разве Лазарус не переводит png в Bitmap, когда png открывает???

Ваш вариант, ещё не пробовал.
В любом случае: Спасибо за ответ.


.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

C bmp работает, возможно проблема в прозрачности png , лазарус возможно не умеет с ней корректно работать , возможно поможет
http://wiki.freepascal.org/Developing_with_Graphics
http://wiki.freepascal.org/BGRABitmap
http://devdelphi.ru/?p=304
http://www.rpdn.ru/forum/17/57/

Код: Выделить всё

var
  bmp: TBitMap;
begin
  Image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Image.png');
  bmp := TBitMap.Create;
  bmp.Assign(Image1.Picture.Graphic);
  bmp.SaveToFile('Image.bmp');
  bmp.Free;
end;


Добавлено спустя 42 минуты 55 секунд:
Вот здесь , кажется , как обойти проблему с png
http://lazarus.freepascal.org/index.php?topic=8145.0
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Громадное спасибо за "http://адреса.ext" - там очень много полезного.

Ism писал(а):возможно проблема в прозрачности png

Изначальная проблема в глубине цвета (8,24,32 bit)... т.к. при различной глубине цвета - разные баги...
А прозрачность качественно работает - только когда png грузится самим Lazarus, а потом идёт сбой :( .
Очевидно я изначально пошёл нестандартным путём TImage, который не работает.
Там полно примеров - очевидно они работают. Спасибо - большое; человеческое.


.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Тут точно есть как работать с прозрачностью и PNG
http://wiki.freepascal.org/BGRABitmap
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

qivi писал(а):Тут точно есть как работать с прозрачностью и PNG

Спасибо. BGRABitmap - умеет всё, что требуется.

Вот здесь - есть ещё больше: http://sourceforge.net/projects/lazpaint/files/


.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Вот здесь - есть ещё больше: http://sourceforge.net/projects/lazpaint/files/

Это программка демонстрирующая его возможности.
Можеш ещё посмотреть набор контролов основанных на нём: http://wiki.freepascal.org/BGRAControls
П.С.: хорошо бы было если бы им заменили стандартное ядро LCL работающее с графикой.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

qivi писал(а):хорошо бы было если бы им заменили стандартное ядро LCL работающее с графикой

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

PS: Было бы правильно если бы его включили в стандартное ядро работающее с графикой.
Однако и в такой ситуации суть в том, что есть ещё более мощные пакеты, единовременно обрабатывающие: и растр, и вектор, и 3D...
Вывод: самый правильный вариант - выбирай, то, что больше нравится... :(


Спасибо.
.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Может это и неправильно, но отсутствие в стандартных средствах нормальной поддержки альфа канала, это очень не удобно, на мой взгляд отрицательно сказывается на всех визуальных компонентах и их возможностях. Надо отметить что BGRABitmap не только имеет актуальные сегодняшнему дню возможности работы с графикой, но и значительно быстрее работает сней.

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

Старый стандарт не надо ломать, его надо заменить с обратной совместимостью и это будет во всех отношениях правильно.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

qivi писал(а):но и значительно быстрее работает сней.

qivi писал(а):Старый стандарт не надо ломать, его надо заменить с обратной совместимостью и это будет во всех отношениях правильно.


Если пакет, который много лучше, войдёт в стандарт - это правильно, т.к. на данном этапе глаза разбегаются от кол-ва возможностей, и стараешься доверять тому, что находится в стандартных(психология)...

Дело Мастера БО...
Моих знаний - не хватит, чтобы заменить на новый стандарт.

Изначальный "баг" связан с кол-вом bit в подгружаемых изображениях...
Короче их(bit'ов) - должно быть одинаково.




.
Ustas
постоялец
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Сообщение Ustas »

Скажите, как TImage проверить на наличие/отсутствия картинки?
Вариант

Код: Выделить всё

Image1.Picture = nil
или

Код: Выделить всё

Image1.Picture.Graphic = nil
не проходят.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Проверить высоту или ширину Bitmap... Если отлична от ноля значит... есть...
Ustas
постоялец
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Сообщение Ustas »

Спасибо, помогло.
Ustas
постоялец
Сообщения: 153
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Сообщение Ustas »

Есть возможность узнать размер пропорционально вписанной в TImage картинки, не репльный размер, а получившийся?
Ответить