Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Прозрачность Bmp


Автор: mistrmax 27.12.2011, 17:54
Здравствуйте.
На форме кнопка BitBtn1, Image1, Image2.
Событие OnClick кнопки:
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
dest,source:TRect;
bmp:TBitmap;
begin
  try
  bmp:=TBitmap.Create; //создаём битмап
  //устанавливаем размеры
  bmp.Width:=Image1.Picture.Icon.Width;
  bmp.Height:=Image1.Picture.Icon.Height;
  //рисуем иконку из первого имаджа (ICO->BMP)
  bmp.Canvas.Draw(0,0,Image1.Picture.Icon);
  //увеличиваем картинку из 32х32 в 48x48
  dest:=Bounds(0,0,48,48);
  source:=Bounds(0,0,32,32);
  Image2.Canvas.CopyRect(dest,bmp.Canvas,source);
  Image2.Picture.Bitmap.Transparent:=true;
  finally
  bmp.free;
  end;
end;

Форма выглядит так после нажатия на кнопку:
user posted image
Как убрать возникающий белый фон. Свойство Image2.Transparent:=true;
Заранее огромное спасибо.

Автор: Alexeis 27.12.2011, 18:13
  Прозрачность в битмапе не является стандартом, тогда как  иконка должна иметь маску прозрачности, поэтому иконка будет рисовать прозрачной, а битмап нет. При копировании картинки из иконки в битмап прозрачность теряется. 

Автор: Dik0n 27.12.2011, 18:19
А зачем так извращатся, не проще ли

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image2.Picture.Assign(Image1.Picture);
end;


Или Transparent не у Bitmap ставить а у Image

Код

  Image2.Transparent := True;

Автор: mistrmax 27.12.2011, 22:05
Alexeis, вы конечно извините, но я всё это уже знаю, так что ничего нового вы для меня не открыли: спасибо, кэп. Проблема в другом. Вы к примеру возьмите на каком-нибудь одноцветном фоне нарисуйте что-нибудь, загрузите в Image и выставьте transparent:=true - фон исчезнет. Этого я и пытаюсь добиться, только обычный способ здесь не помогает.

Dik0n, дело в том, что я увеличиваю иконку в два раза. Читайте внимательно.

Цитата(Dik0n @  27.12.2011,  18:19 Найти цитируемый пост)
Image2.Transparent := True;

Читайте тему перед ответом внимательно [2]. Ибо:

Цитата(mistrmax @  27.12.2011,  17:54 Найти цитируемый пост)
Свойство Image2.Transparent:=true;


Автор: mistrmax 28.12.2011, 09:35
Возможно я ошибся в названии темы. Мне бы хотябы создать видимость прозрачности. Подошло бы даже иземенение этого белого фона на какой-либо другой.

Автор: Alexeis 28.12.2011, 11:05
  Проверьте какой цвет выставлен прозрачным 
Image1.Picture.Bitmap.TransparentColor 

Автор: mistrmax 28.12.2011, 13:42
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
dest,source:TRect;
bmp:TBitmap;
begin
  try
  bmp:=TBitmap.Create; //создаём битмап
  //устанавливаем размеры
  bmp.Width:=Image1.Picture.Icon.Width;
  bmp.Height:=Image1.Picture.Icon.Height;
  //рисуем иконку из первого имаджа (ICO->BMP)
  bmp.Canvas.Draw(0,0,Image1.Picture.Icon);
  dest:=Bounds(0,0,48,48);
  source:=Bounds(0,0,32,32);
  //увеличиваем картинку из 32х32 в 48x48
  Image2.Canvas.CopyRect(dest,bmp.Canvas,source);
  //прозрачность
  Image2.Picture.Bitmap.TransparentColor:=clWhite;
  Image2.Picture.Bitmap.TransparentMode:=tmFixed;
  Image2.Picture.Bitmap.Transparent:=true;
  finally
  bmp.free;
  end;
end;

Тоже самое

Автор: Чучмек 28.12.2011, 17:25
У меня все прекрасно работает.
Цитата(mistrmax @  27.12.2011,  17:54 Найти цитируемый пост)
Image2.Picture.Bitmap.Transparent:=true;

Это лишнее.
Достаточно Image2.Transparent:=true;
Дай исходную иконку.


Автор: mistrmax 28.12.2011, 17:46
Чучмек, вот http://rghost.ru/35646295 . Выберите любую, ни одна не работает.
Кстати можете дать скрин пожалуйста посмотреть на сие чудо.

Автор: Чучмек 28.12.2011, 17:53
Цитата(mistrmax @  28.12.2011,  17:46 Найти цитируемый пост)
Кстати можете дать скрин пожалуйста посмотреть на сие чудо

user posted image

Автор: mistrmax 28.12.2011, 17:59
Чучмек, красота. То что нужно. Если не затруднит киньте код и иконку которую вы использовали. И как у вас с теми что дал я?

Автор: Чучмек 28.12.2011, 18:17
Цитата(mistrmax @  28.12.2011,  17:59 Найти цитируемый пост)
 киньте код и иконку которую вы использовали. И как у вас с теми что дал я? 

Да код тот же самый.
С твоими иконками тоже получается.
Моя иконка вот:
 

Автор: mistrmax 28.12.2011, 18:24
Чучмек, с твоей иконкой получилось. Даже не знаю чё и делать.

Автор: Чучмек 28.12.2011, 20:26
mistrmax, проверь вот это

Автор: mistrmax 29.12.2011, 14:25
Чучмек, работает так как надо. Бред какой-то получается, если ты говоришь что исходники одинаковые. Кинь исходник, если не трудно.

Автор: Чучмек 29.12.2011, 14:48
Ну этот не совсем такой.
Код

procedure TForm1.Button1Click(Sender: TObject);
var W,H:integer;
begin
if not OpenDialog1.Execute then exit;
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
Image1.AutoSize:=true;

Image2.Top:=Image1.Height+10;
Image2.AutoSize:=true;
W:=2*Image1.Picture.Width;
H:=2*Image1.Picture.Height;

Image2.Picture.Bitmap.Canvas.FillRect(Rect(0,0,W,H));
Image2.Picture.Bitmap.PixelFormat:=pf24bit;
Image2.Picture.Bitmap.Width:=W;
Image2.Picture.Bitmap.Height:=H;

DrawIconEx(Image2.Picture.Bitmap.Canvas.Handle, 0, 0, Image1.Picture.Icon.Handle,W,H,0,0,DI_IMAGE);
Image2.Transparent:=true;
Image2.Repaint;
end;

Автор: mistrmax 29.12.2011, 15:28
Чучмек, спасибо, не знал о DrawIconEx. Теперь всё работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)