| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как загрузить картинку в компонент |
| Автор: Emulator 30.4.2004, 18:36 |
| Как загрузить картинку в компонент ImageList так чтобы она имела свойство прозрачности. var BMP:TBitmap; BMP:= TBitmap.Create; BMP.LoadFromFile(MFile); Immages.Add(BMP,BMP); BMP.Free; |
| Автор: _hunter 30.4.2004, 18:54 |
| DrawingStyle = dsTransparent? |
| Автор: Emulator 30.4.2004, 22:50 |
| Нет нужно чтоб розовый фон вокруг картинки был невидим |
| Автор: Medved 1.5.2004, 11:14 |
| Нижний левый пиксель, всегда является цветом прозрачности. |
| Автор: Emulator 1.5.2004, 17:05 |
| И что дальше делать ? |
| Автор: Medved 2.5.2004, 02:02 |
| А ничего. Повторюсь, если вы хотите сделать какие-либо области прозрачными, закрасте их таким цветом, какой в нижнем левом пикселе картинки. Ну а затем загрузите этот битмап в TImageList и радуйтесь результату. |
| Автор: z-END 2.5.2004, 02:25 |
| А че серьезно нижний левый? А я то постоянно к верхнему левому привязывал ну [1,1] типа. |
| Автор: p0s0l 2.5.2004, 16:55 |
| nJIaKca.spb, да серьёзно. Видимо у тебя эти два пиксела всегда совпадали... |
| Автор: Emulator 3.5.2004, 06:54 |
| А как определить Цвет Картинки ? |
| Автор: x77 3.5.2004, 16:20 |
| Pegas, p0s0l, с чего это левый нижний? битмапы бывают двух разных видов, top-down и bottom-up, что соответствует порядку загрузки "строк" пикселей. по умолчанию (т.е. TransparentMode = tmAuto) прозрачность определяет первый пиксел в массиве данных, который может быть как левым нижним, так и левым верхним, в зависимости от типа битмапа. помимо режима по умолчанию, есть режим принудительный, tmFixed, если мне не изменяет память, который включается автоматом при установке свойства TransparentColor. это означает, что если надо сделать розовый цвет прозрачным, надо просто сказать Bmp.TransparentColor := clFuchsia Добавлено @ 16:23 Emulator, а что считается "цветом картинки"? |
| Автор: p0s0l 3.5.2004, 18:28 | ||
| x77, конечно, всё это очень поучительно... Но либо я такой отставший от жизни, либо ты заблуждаешься. Почему-то ниразу мне не приходилось за прозрачность брать левый верхний символ - или вымерли bmp такого вида ? Кстати, бывает иногда полезно заглянуть в хелп:
Нигде нет оговорки про зависимость от формата bmp-шки. Ладно, что там гадать - взял файл "a.bmp" - скопировал его в файл "b.bmp", в Hex-Edit'е поменял свойство Height на отрицательное (было 80h, стало FFFFFF80h), проверил в ACDSEE - теперь одна картинка стала перевернутой копией другой. Загружал эти две картинки в TImage, TImageList - в обоих случаях берется левый нижний пиксел битмапа, независимо от того, перевернутый битмап или нет. Так что твои суждения оказались неверными насчет первого байта данных... |
| Автор: Emulator 3.5.2004, 18:30 |
| Народ Так как Определить Цвет (Левый верхний) ? Если можно то кодом. |
| Автор: p0s0l 3.5.2004, 19:08 |
| У ImageList свойство Masked должно быть True. Свойство DrawingStyle оставь по-умолчанию - dsNormal. Вместо ImageList.Add(Bmp, Bmp) делай так: ImageList1.AddMasked(Bmp, Bmp.Canvas.Pixels[0, 0]); - тогда верхний левый пиксел будет определять цвет прозрачности или же можешь принудительно задать цвет прозрачности: ImageList1.AddMasked(Bmp, clFuchsia); |
| Автор: Emulator 3.5.2004, 22:07 |
| Спасибо Посол! |
| Автор: x77 4.5.2004, 10:32 | ||||
p0s0l, правильно, давай друг друга справками давить:
ты "свою" справку дочитай до конца: TransparentMode определяет, является ли цвет прозрачности высчитываемым автоматически, или берётся из фиксированного значения в битмапе. если он равен tmFixed, то он берётся либо из левого нижнего, либог из левого верхнего в зависимости от типа битмапа. установка свойства TransparentColor автоматом ставит TransparentMode в tmFixed, запрещая, таким образом, автоматическое определение цвета прозрачности. со справкой разобрались. теперь разберёмсяс кодом:
что разницы нет, сказать Bmp.TransparentColor := clFuchsia, как изначально предлагал я, или ImageList.AddMasked (Bmp, clFuchsia), как предлагаешь ты. и в чём моё заблуждение - я пока так и не понял. смысла твоих манипуляций с HexEdit'ом я, если честно, тоже не понял. |
| Автор: p0s0l 6.5.2004, 14:31 | ||||||||||||||||||
| Ну вот, x77 на меня взъелся (совершенно притом несправедливо Я сказал, что прозрачный пиксел определяется левым нижним пикселом картинки. На что ты ответил: [quoute]Pegas, p0s0l, с чего это левый нижний? битмапы бывают двух разных видов, top-down и bottom-up, что соответствует порядку загрузки "строк" пикселей. по умолчанию (т.е. TransparentMode = tmAuto) прозрачность определяет первый пиксел в массиве данных, который может быть как левым нижним, так и левым верхним, в зависимости от типа битмапа.[/quote] Отсюда ясно следует твоя мысль - что пиксел прозрачности может быть и ЛЕВЫМ ВЕРХНИМ. Со справкой: Справки могут морально устаревать (их писали тоже люди, которые могли забыть изменить какой-нибудь абзац)... Ладно, проверим: две одинаковых (по содержанию) картинки: одна top-down, другая bottom-up:
И что я вижу - Label1 и Label2 содержат разные значения, хотя сами данные картинок у них совпадают - т.е. берется в любом случае левый нижний пиксел, а не "the color of the first pixel in the bitmap image data"... Видимо, в справке остался атавизм - может это было раньше так, но сейчас (в D7) точно не так (ниже приведу уже 100% доказательство), ведь правильнее за цвет прозрачности брать один и тот же пиксел картинки (не важно, верхний левый или нижний левый, лишь бы один и тот же). А то если я буду грузить картинку, я ж не знаю, какая она - topdown или bottomup ? Интересно будет, если я юзаю в проге кучу иконок, выдернутых из разных источников, половина одной ориентации, половина - другой... Ладно, для пущей уверенности взглянем на один интересный метод TBitmap - установка свойства TransparentMode сводится в конце концов к вызову этого метода:
И отсюда ясно видно, без всяких яких, какой же именно пиксел берется за цвет прозрачности...
Лучше бы проверил теорию на практике. Я всегда проверяю... Разница - есть! Создай новый проект, засунь туда ImageList (и к примеру, ToolBar, а в нем две кнопки с ImageIndex=0 и ImageIndex=1), и попробуй код:
Это было первое, что я попробовал. И tmAuto тоже не помогает - всё равно картинки без прозрачности. А вот это уже работает:
Так что разница есть...
А ты как думал определяется ориентация картинки ? По желанию программиста что-ли ? Top-down и bottom-up ориентация определяется значением поля biHeight у структуры BITMAPINFOHEADER:
Надеюсь, не надо объяснять, откуда взялось FFFFFF80 вместо 00000080 ? Вывод: либо ты не проверяешь ниодного из своих доводов, либо сидишь на другой дельфи (помнишь аналогичную историю с DBGrid'ом ? Мы тоже там друг друга долго не могли понять... пока не выяснилось, что дело в разных версиях Delphi)... |
| Автор: x77 6.5.2004, 14:35 |
| p0s0l, сейчас не могу предметно ответить, подыхаю. то ли отравился, то ли хрен его знает. позже отпишу. но я ни в коем случае не взъелся |
| Автор: p0s0l 6.5.2004, 14:46 |
| x77, главное - не подыхай! Куда мы тут без тебя ? А спор - это фигня... В итоге оба окажемся неправы, или оба правы |
| Автор: Guest 6.5.2004, 16:04 | ||||||
Ты прав в итоге вы оба не правы. *.bmp не
Это взято из описания формата *.bmp
|
| Автор: p0s0l 6.5.2004, 16:28 |
| Даммм.... Щас тут будут цитировать строки неизвестных авторов из неизвестных описаний... Если я найду описание bmp, где написано, что пикселы в нем располагаются по синусоидам, и процитирую это - нормально будет ? Это 100%, что bmp могут быть верхтормашками расположены, и наоборот... Против этого не попрешь - и Photoshop умеет сохрянать разными ориентациями, и в MSDN написано об ориентациях, и MS API Reference тоже... Так что, гость, тут ты сам ошибаешься... |