Надпись на картинке Vampyre Imaging

Общие вопросы программирования, алгоритмы и т.п.

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

Re: Надпись на картинке Vampyre Imaging

Сообщение zub » 13.03.2018 09:01:41

pupsik
Спасибо, вопрос решен

Добавлено спустя 1 минуту 49 секунд:
хотя выглядит тоже костыльно - канал заполняется 255 при конвертации, потом ручками сбрасываем его в 0... но всеже лучше чем править чужие исходники
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Надпись на картинке Vampyre Imaging

Сообщение pupsik » 13.03.2018 09:17:17

а в поток скидывать? Так хоть аккуратный костыль.

п.с.
можно, конечно, подправить. Но, мне кажется, овчинка не стоит.

Добавлено спустя 10 минут 48 секунд:
Да и костыль сам разраб сделал. Точнее он сделал то что ему нужно. Остальное - дело другое. Использовать битмап для отрисовки не сильно соответствует логике. Ведь он должен отображать, а канва - рисовать...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 00:34:20

zub писал(а):т.е. при копировании из TMultiImage в TPicture добавляется альфаканал, заполняемый значением 255. если исходники Vampyre поправить и заполнить альфу нулем, то все начинает работать.

Это ведь не баг, как можно обойти без правки Vampyre?

хотя выглядит тоже костыльно - канал заполняется 255 при конвертации, потом ручками сбрасываем его в 0

это и есть 32 бита, когда в 24 бита дополняется маска (альфа канал с прозрачностью) и получается 32 бита. То что вы альфаканал заполняете нолями, это неправильное решение. Правильное решение, сказать вампировской картинке, что она теперь 24 битная, а не 32 и тогда маска (альфаканал) - исчезнет из битмапки и ненужно будет заполнять её нолями. Соответственно тогда исчезнет глюк в Timage и/или TPicture, т.к. им подадут 24 бита, в которых они работают, а не 32 в которых их глючит. Мне кажется это было-бы, более правильное решение, нежели заполнять маску(альфаканал) нолями.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение pupsik » 14.03.2018 00:58:13

vitaly_l : ifA8R8G8B8... и кого наследует битмап вампирки (по пути приобретая 24 бита)?

Соответственно тогда исчезнет глюк в Timage, т.к. ему подадут 24 бита
а где логика? Получается что вампирка не загружает изображения? Ведь в вампирке всегда есть альфа канал. Знч.... она не может загружать изображения. И вот имедж ждёт, а вампирка не даёт :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 01:02:38

pupsik писал(а):ifA8R8G8B8

Да, да, да - это из этой серии. Там таких много названий. Буквы RGB - обозначают RGB, а циферки предположительно битность. Соответственно ifA8R8G8B8 - это по 8 бит на канал + А - это альфа. Хорошие программисты - они конкретны в названиях переменных и каждый символ имеет вес.

pupsik писал(а):Ведь в вампирке всегда есть альфа канал

Нет. Думаю Вампиру пофигу на альфа канал. Думаю, если ему скормить 24 битную картинку, он её съест и не поперхнётся. В самом страшном случае, добавит в неё нулевой альфаканал и сделает 32 битной.

Добавлено спустя 1 минуту 55 секунд:
pupsik писал(а):а где логика?

Логика у художников в голове. (наверное :oops: )
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение zub » 14.03.2018 07:51:14

vitaly_l
Рассуждать (не гадать) надо было на предыдущей странице топика

>>это и есть 32 бита, когда в 24 бита дополняется маска (альфа канал с прозрачностью) и получается 32 бита.
спасибо, просветил))

>>Правильное решение, сказать вампировской картинке, что она теперь 24 битная, а не 32 и тогда маска (альфаканал) - исчезнет из битмапки и ненужно будет заполнять её нолями
Прикинь, она изначально 24 битная, в ifA8R8G8B8 она конвертится в момент TPicture.Graphic.Assign(TMultiImage);, уж незнаю по какой причине

>>Соответственно тогда исчезнет глюк в Timage и/или TPicture, т.к. им подадут 24 бита
Повторяю, им подают 24 бита.

Вместо пустых слов отладчик в руки и вперед
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 11:22:54

zub писал(а):Вместо пустых слов отладчик в руки и вперед

В отличии от некоторых, я ещё на прошлой странице указал причину и как выяснилось я был прав.

zub писал(а):Прикинь, она изначально 24 битная, в ifA8R8G8B8 она конвертится в момент TPicture.Graphic.Assign(TMultiImage);, уж незнаю по какой причине

ifA8R8G8B8 - это и есть 32 бита! 8+8+8 = 24 + ещё 8 на А8 (A8 - это и есть альфа) итого 32. Вот если бы было ifR8G8B8, то это было бы 24. И вот эти обозначения: ifA8R8G8B8 и ifR8G8B8 - это не из Tbitmap взято, т.к. в Tbitmap пишется в битах. Соответственно, картинка подаётся в 32 битах ifA8R8G8B8 - это и есть проверка на 32 бита. Кроме того, оно может подаваться и в 48-ми битах. А если там что-то конвертится в 32 бита при работе с Tbitmap, то это уже новодел вставленный из Вампира. И об этом я также Вам написал на прошлой странице. Читайте внимательнее.

Кто и как определил что там 24 бита? (судя по результату там 32 бита, а не 24).
Код проверки покажи-те. Да и как Вы смогли-бы в 24 битах обнулить маску из 32-х?

Добавлено спустя 55 минут 55 секунд:
И самое главное, я Вам писал, что Вампир там что-то переопределил в Tbitmap и его глючит, т.к. если я создаю НОВЫЙ проект, то текст рисуется правильно (красным). А если я беру Ваш проект (с Вампиром), то текст ДАЖЕ БЕЗ ПОДКЛЮЧЕНИЯ TMultiImage и юнитов Вампира - рисуется серым или белым. Конкретно в вашем проекте, Вампир подменил какие-то установки для Tbitmap, Tpicture, Timage. Вот на это обратите внимание и возможно найдёте сбой. Попробуйте например, создать новый проект и не устанавливать в него Вампир, а только подключить юнит с TMultiImage. Чтобы Вампир не смог переопределить установки для Tbitmap, Tpicture, Timage. <== Вот как-то так.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение zub » 14.03.2018 12:56:46

>>В отличии от некоторых, я ещё на прошлой странице указал причину и как выяснилось я был прав.
какаято хрень, какаято маска, чтото глючит... это не указал. это даже не угадал. кокраз некоторые нашли причину и некоторые предложили как ее обойти

>>ifA8R8G8B8 - это и есть 32 бита!
Ты читаешь то, на что ты отвечаешь?

>>Кто и как определил что там 24 бита? (судя по результату там 32 бита, а не 24).
я. поверь мне наслово, до TPicture.Graphic.Assign(TMultiImage) в TMultiImage только 24 бита. после уже 32 бита с а=255. pupsik же предложил эту конвертацию сделать самомтоятельно и самомтоятельно же заполнить альфу нужным значением.

И самое главное, я Вам писал, что Вампир там что-то переопределил в Tbitmap и его глючит, т.к. если я создаю НОВЫЙ проект, то текст рисуется правильно (красным). А если я беру Ваш проект (с Вампиром), то текст ДАЖЕ БЕЗ ПОДКЛЮЧЕНИЯ TMultiImage и юнитов Вампира - рисуется серым или белым. Конкретно в вашем проекте, Вампир подменил какие-то установки для Tbitmap, Tpicture, Timage. Вот на это обратите внимание и возможно найдёте сбой. Попробуйте например, создать новый проект и не устанавливать в него Вампир, а только подключить юнит с TMultiImage. Чтобы Вампир не смог переопределить установки для Tbitmap, Tpicture, Timage. <== Вот как-то так.

ты выложишь эти 2 проекта?

>>Чтобы Вампир не смог переопределить установки для Tbitmap, Tpicture, Timage.
подключай модуль чеснок до вампировских модулей
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 13:27:18

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

Про маски - это был поиск. А про вердикт, я вот про этот пост говорил:
vitaly_l писал(а):zub писал(а):
Как надо сделать описано в первом посте. Есть TMultiImage с картинкой, в него надо вписать цветной текст и отдать обратно. ферштейн?
Ты пишешь текст на экранный канвас, мне нужно писать на "чтото" в памяти, не асоциированое с устройством отображения. ферштейн?

Это наверное очень удивит, но стоит мне загрузить ваш проект, как перестаёт работать Timage. Однако, если я создаю новый проект, загружаю картинку и там рисую текст в Timage, то он рисуется красным на картинке. Но стоит мне тоже самое сделать в вашем проекте, как текст начинает рисоваться белым. Вы как-то там поломали Timage или точнее какие-то запчасти от него, когда подключали Vampyre. Я при тесте Timage даже не подгружаю TMultiImage в вашем проекте и закомментировал его юниты, но всё равно если беру ваш проект то рисуется белым. А если создаю новый проект, то в Timage всё работает и текст рисуется красным. ферштейн, кто всё поломал?

Добавлено спустя 111 час 111 минут 111 секунд:
zub писал(а):
Проблема оказалась чуток не тут. если LImg сохранить в файл, то там надпись красная

Попробуйте сохранить img и удивитесь ещё больше, т.к. текст вообще будет то серым, то красным (в зависимости где смотреть). Такое возможно из-за разной битности или иных цветовых установок у Vampyre и TImage. И похоже Vampyre, как-то "подменил" установки битности по умолчанию у TImage и последнего от этого сильно глючит, тогда дело не в маске а в битности. Короче проблема в разной битности получаемых и обрабатываемых картинок, т.к. лазарус по умолчанию работает только с 24 битами, а Vampyre с 32. + ещё маска


zub писал(а):ты выложишь эти 2 проекта?

Я к сожалению все их удалил с машины, как только причина стала ясна. Решение я всё равно не стал-бы искать, т.к. на мой взгляд, овчинка выделки не стоит. Есть стандартные средства лазаруса и они предназначены для рисования поставленной задачи. Вампир насколько я понимаю, умеет только отображать и не предназначен для рисования. Соответственно и нужно рисовать стандартной битмапкой и отправлять результат вампиру (раз уж нужен именно вампир). Но проблема в том что, стоит только подключить модуль вампира, так сразу: Timage, Tpicture, TBitmap - перестают рисовать красный текст. Вот на этом всё становится на свои места, т.к. остальное это уже: "дело мастера БО". Вот как только сможете нарисовать КРАСНЫЙ текст на обычной TBitmap и отобразить его в обычном Timage и это при подключенном Вампире, то мгновенно увидите, что избавились от бага.

Порядок действий такой:
1) Создаёте новый проект в лазарусе.
2) Включаете туда этот код:
Код: Выделить всё
var
  ts:TTextStyle;
  bmp:TBitmap;
begin
  Image1.Picture.LoadFromFile('balalayka.jpg');
  bmp:=TBitmap.Create;
  bmp.Height:=Height;
  bmp.Width:=Width;
  ts:=bmp.Canvas.TextStyle;

  bmp.Assign(Image1.Picture.Bitmap);

  bmp.Canvas.Font.Size:=111;
  bmp.Canvas.Font.Quality:=fqCleartypeNatural;
  bmp.Canvas.Font.Color:=clRed;
  bmp.Canvas.TextRect(Rect(0,0,bmp.Width,bmp.Height),0,0,'TEST',ts);
  Image1.Picture.Bitmap.Assign(bmp);
bmp.freee ;)

3) После того как убедились что тест на Image1 рисуется красным, пытаетесь подключить вампир.
4) Если текст на Image1, при подключении вампира - перестаёт рисоваться красным, начинаете делать вышеописанные Вами пасы с чесноком.
5) Как только при подключенном вампире, Ваш Image1 - выведет красный текст, это будет означать что Вы избавились от бага.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение pupsik » 14.03.2018 15:55:47

Мдя...

vitaly_l дело в том что вы гадали. О "подмене" ясно с начала поста. А вот где она и почему.... Вы конечно указали и .... или вкл. музыканта?
Код: Выделить всё
procedure TForm1.ShowText(a_file : string);
var
  ts:TTextStyle;
  ACanvas: TImagingCanvas;
begin
  FImage.LoadFromFile(a_file);
//  FImage.ConvertImages(ifA8R8G8B8);  // как бы не хотелось привести изображение в "желаемый" формат
  With FBitmap do
  begin
    Canvas.Lock;
    AssignFromImage(FImage);
    ts := FBitmap.Canvas.TextStyle;
    ts.Alignment :=taLeftJustify;
    ts.Layout :=tlTop;

    Canvas.Font.Size := 80;
    Canvas.Font.Quality := fqCleartypeNatural;
    Canvas.Font.Color := ColorButton1.ButtonColor;
    Canvas.TextRect(Rect(0,0, Width, Height),0, 0,'Проверка', ts);
    Canvas.Unlock;
    AssignToImage(FImage); //вампирка "считает"  что в битмапе 32 бита, а имедж толкнул 24. (В коде вампира есть интересные комиты).
  end;
  FImage.ConvertImages(ifR8G8B8);//но мы "хотим" 24 бита (спасибо image, если быть точнее не ему).
{убираем этот затык
  ACanvas := TImagingCanvas.CreateForImage(FImage);
  ACanvas.FillChannel(ChannelAlpha, 0);
  ACanvas.Free;}
  Image1.Picture.Graphic.Assign(FImage);
end; 


Можно ведь указать что в коде не верно... Дык не... вы свой изысканный вкус вылили. И когда зуб доковырял "почему". Вы опять вылили вкус да ещё уточняя: "я ж писал"... А толку от писанины?

п.с.
Я вообще писал о канве... Ну нет желания добавлять через канву рисование текста (да и опыта маловато). Там буковок много. Значит ищем обход через ... В принципе: как обычно.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 16:08:13

pupsik писал(а):Я вообще писал о канве

А я искал баг и причину того что, текст ВДРУГ, после подключения Вампира - перестал отображаться нормально Красным, штатными средствами. Мы с Вами решали разные методы одной и той же задачи. Я искал причину порчи нормальной работы, ШТАТНЫХ: Tbimap, Tpicture, Timage, TCanvas, а Вы предложили работать на TImagingCanvas. Но при этом, баг. появляющийся при подключении Вампира - всё равно остался в системе, несмотря на то что текст стал рисоваться TImagingCanvas. Суть в том что он(красный текст) и штатными средствами рисовался красным, но при отображении перекрывался маской в альфаканале, однако при сохранении в файл, красный текст снова отображался нормально, т.к. маска не сохранялась в 24 битной картинке. Прочитайте чего там Зуб писал про свои эксперименты. Он ясно изложил симптомы бага.

Вот нужно понять, что именно там происходит при подключении Вампира и тогда мгновенно заработают абсолютно все варианты, после того как будет выявлен баг, проявляющийся при подключении Вампира.


Добавлено спустя 8 минут 88 секунд:
pupsik писал(а):указать что в коде не верно

Я указываю суть и причину. А где это в коде - я не знаю.

Добавлено спустя 7 минут 77 секунд:
pupsik писал(а):FImage.ConvertImages(ifR8G8B8);

Вот это правильная строчка, она(R8G8B8) как раз приводит в 24 бита, которые понимают, штатные: Tbimap, Tpicture, Timage, TCanvas, но это не отменяет баг, кторый возникает при подключении вампира, т.к. при подключении вампира перестают работать ШТАТНЫЕ средства рисования красного текста на Tbimap, Tpicture, Timage, TCanvas.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение pupsik » 14.03.2018 16:35:39

А я искал баг и причину того что...
:mrgreen:
Вот если использовать велик вместо авто. И попытаться затарить его 500 кг... Он может 100 км/час набрать (уточню... без использования самолётов, гор и схожего :)) ?
Битмап - для отображения... Канва - для рисования. Пытаясь использовать то что для этого не предназначено. Нарываемся на артефакты.

несмотря на то что текст стал рисоваться TImagingCanvas.
чаво? Канва вампира не может рисовать текст (зуб это заметил ранее :))... Её надо модифицировать, улучшить и т.д... В принципе она может рисовать текст. Только нет процедуры рисования :wink:

п.с.
Я искал причину порчи нормальной работы, ШТАТНЫХ: Tbimap, Tpicture, Timage, TCanvas
эво как...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 16:40:19

pupsik писал(а):чаво? Канва вампира не может рисовать текст

Я знаю. Зато канва(TCanvas) у: Tbimap, Tpicture, Timage - делает это(рисует красный текст) успешно, т.к. является основой для всех них, я про (Tbimap, Tpicture, Timage). И я не удивлюсь если выяснится что она(TCanvas) и для TImagingCanvas является основой. Так вот проблема в том что при подключении Вампира ШТАТНАЯ TCanvas перестаёт рисовать красным. Точнее при отображении в Timage - текст в ней перекрывается маской / альфаканалом. <== вот причина, а использование TImagingCanvas <== это костыль.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Надпись на картинке Vampyre Imaging

Сообщение pupsik » 14.03.2018 17:23:15

И я не удивлюсь если выяснится что она(TCanvas) и для TImagingCanvas является основой.
хм...: TImagingCanvas = class(TObject). В принципе схожесть есть но не то.

Шо ж там так закручено что "теряет" цвет при игре с битмапом?
я, для себя ответ нашёл. Хотя и не считаю верным использование битмапа, а не канвы. Но: если использование канвы влечёт за собой некоторые сложности. Пускай будет битмап.

Кстати код, изложенный выше, убирает костыль (?). И, по идее, соответствует логике: "если надо 24 и только его - получи".

п.с.
Но елки... использование битмапа - тот ещё костыль. Проще задействовать стандартный набор из лазаря. Хотя, если далее будут использоваться плюшки вампира... То уж тогда такой костыль - хоть как то подойдёт.

Добавлено спустя 4 минуты 27 секунд:
...ШТАТНАЯ TCanvas перестаёт рисовать красным.
не перестаёт...
/ альфаканалом. <== вот причина
нет...
а использование TImagingCanvas <== это костыль
тогда надо срочно убрать TFPCustomCanvas. Чё он под ногами ковыряется :lol:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Надпись на картинке Vampyre Imaging

Сообщение vitaly_l » 14.03.2018 17:32:48

pupsik писал(а):использование битмапа - тот ещё костыль.

Хорошо, я услышал. Вы правы. Вместо Tbimap можно использовать TCanvas, т.к. в Tbimap в любом случае рисование будет на TCanvas.
pupsik писал(а):TImagingCanvas = class(TObject).

Ну значит оно отличается от штатного TCanvas, но при этом и штатный TCanvas - рисует точно такой-же текст и его можно отправить Вампиру или Timage.

Но основной проблемой является не Canvas, а именно тот факт, что при подключении Вампира - Timage, перестаёт работать как надо из-за смены битности, которую вносит в код Вампир. Это происходит, даже при работе с TCanvas и Tbimap, после подключения Вампира. Соответственно, если в Вашем случае баг обходится вот так FImage.ConvertImages(ifR8G8B8);, то в случае с штатным средством тоже можно задать 24 бита и всё начнёт отображаться.

Но чтобы отловить БАГ - нужно найти что именно прописывает Вампир при подключении. Сбой происходит именно в Timage, который отображает картинку. Или где-то в его предках, которыми являются: Tpicture => Tbimap => TCanvas.


.
Последний раз редактировалось vitaly_l 14.03.2018 18:05:53, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru