Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как загрузить картинку в компонент 
:(
    Опции темы
Emulator
Дата 30.4.2004, 18:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как загрузить картинку в компонент
ImageList так чтобы она имела свойство прозрачности.


var BMP:TBitmap;

BMP:= TBitmap.Create;
BMP.LoadFromFile(MFile);
Immages.Add(BMP,BMP);
BMP.Free;
  Вверх
_hunter
Дата 30.4.2004, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



DrawingStyle = dsTransparent?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Emulator
Дата 30.4.2004, 22:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нет нужно чтоб розовый фон вокруг картинки был невидим
  Вверх
Medved
Дата 1.5.2004, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Нижний левый пиксель, всегда является цветом прозрачности.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Emulator
Дата 1.5.2004, 17:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











И что дальше делать ?
  Вверх
Medved
Дата 2.5.2004, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



А ничего.
Повторюсь, если вы хотите сделать какие-либо области прозрачными, закрасте их таким цветом, какой в нижнем левом пикселе картинки. Ну а затем загрузите этот битмап в TImageList и радуйтесь результату.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
z-END
Дата 2.5.2004, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



А че серьезно нижний левый?
А я то постоянно к верхнему левому привязывал ну [1,1] типа. withstupid.gif


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
p0s0l
Дата 2.5.2004, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



nJIaKca.spb, да серьёзно. Видимо у тебя эти два пиксела всегда совпадали...


--------------------
С уважением, г-н Посол.
PM   Вверх
Emulator
Дата 3.5.2004, 06:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как определить Цвет Картинки ?
  Вверх
x77
Дата 3.5.2004, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Pegas, p0s0l, с чего это левый нижний? битмапы бывают двух разных видов, top-down и bottom-up, что соответствует порядку загрузки "строк" пикселей. по умолчанию (т.е. TransparentMode = tmAuto) прозрачность определяет первый пиксел в массиве данных, который может быть как левым нижним, так и левым верхним, в зависимости от типа битмапа. помимо режима по умолчанию, есть режим принудительный, tmFixed, если мне не изменяет память, который включается автоматом при установке свойства TransparentColor.

это означает, что если надо сделать розовый цвет прозрачным, надо просто сказать Bmp.TransparentColor := clFuchsia

Добавлено @ 16:23
Emulator, а что считается "цветом картинки"? smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 3.5.2004, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



x77, конечно, всё это очень поучительно... Но либо я такой отставший от жизни, либо ты заблуждаешься. Почему-то ниразу мне не приходилось за прозрачность брать левый верхний символ - или вымерли bmp такого вида ?
Кстати, бывает иногда полезно заглянуть в хелп:
Цитата
When TransparentMode is set to tmAuto (the default), the TransparentColor property returns the color of the bottom-leftmost pixel of the bitmap image.

Нигде нет оговорки про зависимость от формата bmp-шки.

Ладно, что там гадать - взял файл "a.bmp" - скопировал его в файл "b.bmp", в Hex-Edit'е поменял свойство Height на отрицательное (было 80h, стало FFFFFF80h), проверил в ACDSEE - теперь одна картинка стала перевернутой копией другой. Загружал эти две картинки в TImage, TImageList - в обоих случаях берется левый нижний пиксел битмапа, независимо от того, перевернутый битмап или нет. Так что твои суждения оказались неверными насчет первого байта данных...




--------------------
С уважением, г-н Посол.
PM   Вверх
Emulator
Дата 3.5.2004, 18:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ Так как Определить Цвет (Левый верхний) ? Если можно то кодом.
  Вверх
p0s0l
Дата 3.5.2004, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



У ImageList свойство Masked должно быть True.
Свойство DrawingStyle оставь по-умолчанию - dsNormal.

Вместо ImageList.Add(Bmp, Bmp) делай так:
ImageList1.AddMasked(Bmp, Bmp.Canvas.Pixels[0, 0]); - тогда верхний левый пиксел будет определять цвет прозрачности
или же можешь принудительно задать цвет прозрачности:
ImageList1.AddMasked(Bmp, clFuchsia);



--------------------
С уважением, г-н Посол.
PM   Вверх
Emulator
Дата 3.5.2004, 22:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо Посол!
  Вверх
x77
Дата 4.5.2004, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



p0s0l, правильно, давай друг друга справками давить:

Цитата

Determines which color of the bitmap is to be transparent when the bitmap is drawn.

property TransparentColor: TColor;

Description

Use TransparentColor to determine how to draw the bitmap transparently. When the TransparentMode property is set to tmAuto (default), TransparentColor returns the color of the first pixel in the bitmap image data. For "bottom-up" bitmaps, the first pixel is the bottom leftmost pixel shown onscreen. For "top-down" bitmaps (less common), the first pixel is in the top left corner shown onscreen.

If TransparentColor is assigned, the TransparentMode is automatically set to tmFixed so that the new transparent color can be used later. If you want TransparentColor to disregard any assignments and return the bottom leftmost pixel color again, set TransparentMode to tmAuto.


ты "свою" справку дочитай до конца: TransparentMode определяет, является ли цвет прозрачности высчитываемым автоматически, или берётся из фиксированного значения в битмапе. если он равен tmFixed, то он берётся либо из левого нижнего, либог из левого верхнего в зависимости от типа битмапа. установка свойства TransparentColor автоматом ставит TransparentMode в tmFixed, запрещая, таким образом, автоматическое определение цвета прозрачности.

со справкой разобрались. теперь разберёмсяс кодом:

Код

function TCustomImageList.AddMasked(Image: TBitmap; MaskColor: TColor): Integer;
var
 ImageDDB: TBitmap;
begin
 ImageDDB := TBitmap.Create;
 try
   if Masked and (MaskColor <> -1) then
   begin
     with TBitmap.Create do
     try
       Assign(Image);

       { обрати внимание на следующую строчку }
       TransparentColor := MaskColor;

       Self.HandleNeeded;
       Result := ImageList_Add(Self.FHandle, GetImageHandle(Image, ImageDDB),
         GetBitmapHandle(MaskHandle));
     finally
       Free;
     end;
   end
   else Result := ImageList_Add(Handle, GetImageHandle(Image, ImageDDB), 0);
 finally
   ImageDDB.Free;
 end;
 Change;
end;


что разницы нет, сказать Bmp.TransparentColor := clFuchsia, как изначально предлагал я, или ImageList.AddMasked (Bmp, clFuchsia), как предлагаешь ты. и в чём моё заблуждение - я пока так и не понял.

смысла твоих манипуляций с HexEdit'ом я, если честно, тоже не понял. sad.gif

Это сообщение отредактировал(а) x77 - 4.5.2004, 10:34


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 6.5.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ну вот, x77 на меня взъелся (совершенно притом несправедливоsad.gif)...
Я сказал, что прозрачный пиксел определяется левым нижним пикселом картинки. На что ты ответил:
[quoute]Pegas, p0s0l, с чего это левый нижний? битмапы бывают двух разных видов, top-down и bottom-up, что соответствует порядку загрузки "строк" пикселей. по умолчанию (т.е. TransparentMode = tmAuto) прозрачность определяет первый пиксел в массиве данных, который может быть как левым нижним, так и левым верхним, в зависимости от типа битмапа.[/quote]
Отсюда ясно следует твоя мысль - что пиксел прозрачности может быть и ЛЕВЫМ ВЕРХНИМ.

Со справкой: Справки могут морально устаревать (их писали тоже люди, которые могли забыть изменить какой-нибудь абзац)... Ладно, проверим:
две одинаковых (по содержанию) картинки: одна top-down, другая bottom-up:
Код
var
 bmp : TBitmap;
begin
 bmp := TBitmap.Create;
 bmp.LoadFromFile('c:\a.bmp');
 bmp.TransparentMode := tmAuto;
 Label1.Caption := IntToHex(bmp.TransparentColor, 8);
 Image1.Canvas.Draw(0, 0, bmp);

 bmp.LoadFromFile('c:\b.bmp');
 bmp.TransparentMode := tmAuto;
 Label2.Caption := IntToHex(bmp.TransparentColor, 8);
 Image2.Canvas.Draw(0, 0, bmp);
 bmp.Free;
end;

И что я вижу - Label1 и Label2 содержат разные значения, хотя сами данные картинок у них совпадают - т.е. берется в любом случае левый нижний пиксел, а не "the color of the first pixel in the bitmap image data"...
Видимо, в справке остался атавизм - может это было раньше так, но сейчас (в D7) точно не так (ниже приведу уже 100% доказательство), ведь правильнее за цвет прозрачности брать один и тот же пиксел картинки (не важно, верхний левый или нижний левый, лишь бы один и тот же). А то если я буду грузить картинку, я ж не знаю, какая она - topdown или bottomup ? Интересно будет, если я юзаю в проге кучу иконок, выдернутых из разных источников, половина одной ориентации, половина - другой...
Ладно, для пущей уверенности взглянем на один интересный метод TBitmap - установка свойства TransparentMode сводится в конце концов к вызову этого метода:
Код
function TBitmap.GetTransparentColor: TColor;
begin
 if FTransparentColor = clDefault then
 begin
   if Monochrome then
     Result := clWhite
   else
     Result := Canvas.Pixels[0, Height - 1]; //// <<<--- Только совсем неверующий не уверует после этого...
 end
 else Result := ColorToRGB(FTransparentColor);
 Result := Result or $02000000;
end;

И отсюда ясно видно, без всяких яких, какой же именно пиксел берется за цвет прозрачности...

Цитата
что разницы нет, сказать Bmp.TransparentColor := clFuchsia, как изначально предлагал я, или ImageList.AddMasked (Bmp, clFuchsia), как предлагаешь ты.

Лучше бы проверил теорию на практике. Я всегда проверяю... Разница - есть!
Создай новый проект, засунь туда ImageList (и к примеру, ToolBar, а в нем две кнопки с ImageIndex=0 и ImageIndex=1), и попробуй код:
Код
var
 bmp : TBitmap;
begin
 bmp := TBitmap.Create;
 bmp.LoadFromFile('c:\a.bmp');
 bmp.TransparentColor := clYellow;
 ImageList1.Add(bmp, nil);

 bmp.LoadFromFile('c:\b.bmp');
 ImageList1.Add(bmp, nil);
 bmp.Free;
end;

Это было первое, что я попробовал. И tmAuto тоже не помогает - всё равно картинки без прозрачности. А вот это уже работает:
Код
var
 bmp : TBitmap;
begin
 bmp := TBitmap.Create;
 bmp.LoadFromFile('c:\a.bmp');
 ImageList1.AddMasked(bmp, clYellow);

 bmp.LoadFromFile('c:\b.bmp');
 ImageList1.AddMasked(bmp, clYellow);
 bmp.Free;
end;

Так что разница есть...

Цитата
и в чём моё заблуждение - я пока так и не понял
Ответ:
Цитата
Так что твои суждения оказались неверными насчет первого байта данных...


Цитата
смысла твоих манипуляций с HexEdit'ом я, если честно, тоже не понял.

А ты как думал определяется ориентация картинки ? По желанию программиста что-ли ? Top-down и bottom-up ориентация определяется значением поля biHeight у структуры BITMAPINFOHEADER:
Цитата

biHeight
Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.

Надеюсь, не надо объяснять, откуда взялось FFFFFF80 вместо 00000080 ?

Вывод: либо ты не проверяешь ниодного из своих доводов, либо сидишь на другой дельфи (помнишь аналогичную историю с DBGrid'ом ? Мы тоже там друг друга долго не могли понять... пока не выяснилось, что дело в разных версиях Delphi)...


--------------------
С уважением, г-н Посол.
PM   Вверх
x77
Дата 6.5.2004, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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

но я ни в коем случае не взъелся smile.gif если был резок - извини.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 6.5.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



x77, главное - не подыхай! Куда мы тут без тебя ?
А спор - это фигня... В итоге оба окажемся неправы, или оба правы smile.gif


--------------------
С уважением, г-н Посол.
PM   Вверх
Guest
Дата 6.5.2004, 16:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
x77, главное - не подыхай! Куда мы тут без тебя ?
А спор - это фигня... В итоге оба окажемся неправы, или оба правы 


Ты прав в итоге вы оба не правы.

*.bmp не
Цитата

бывают двух разных видов, top-down и bottom-up, что соответствует порядку загрузки "строк"


Это взято из описания формата *.bmp
Цитата

..............ЗДЕСЬ ОПИСАНИЕ СТРУКТУРЫ ФАЙЛА........... если кому интересно могу выложить
После того, как все параметры битового образа определены, в файле идут сами скан-строки битовой плоскости, причем первой скан-строкой в формате DIB считается нижняя скан-строка (т.е. начало координат находится в левом нижнем углу изображения).

  Вверх
p0s0l
Дата 6.5.2004, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Даммм.... Щас тут будут цитировать строки неизвестных авторов из неизвестных описаний... Если я найду описание bmp, где написано, что пикселы в нем располагаются по синусоидам, и процитирую это - нормально будет ? Это 100%, что bmp могут быть верхтормашками расположены, и наоборот... Против этого не попрешь - и Photoshop умеет сохрянать разными ориентациями, и в MSDN написано об ориентациях, и MS API Reference тоже... Так что, гость, тут ты сам ошибаешься...



--------------------
С уважением, г-н Посол.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.