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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прозрачность в GDI+ 
:(
    Опции темы
gonzales
Дата 22.7.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 2



Приветствую уважаемые!!!
А не подскажет кто-нибудь, как реализовать на GDI+ маскирование одного имиджа по маске из другого файла
Пытаюсь реализовать через Graphics.SetClip, работает только при преобразовании битмапа в регион, но тогда теряется полупрозрачность, что недопустимо

Вот такой код не работает
Код

 Graphics := TGPGraphics.Create(image1.Canvas.Handle);
 Image:=TGPImage.Create('1.jpg');
 pngImage:=TGPImage.Create('2.png');
 g:=TGPGraphics.Create(pngImage);
 Graphics.SetClip(g); // клиппинг не срабатывает
 Graphics.DrawImage(image,0,0,700,700);

--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
gonzales
Дата 25.7.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 2



я так понимаю, пока без идей?

от безысходности реализовал схлопывание 24битного изображения с 8битной маской в 32битный битмап. Не могу его теперь положить на TImage с сохранением прозрачности. 
Неужели TImage этого не поддерживает? 
На GDI+ тоже не выходит. Если TImage на котором я хочу вывести битмап присвоить pf32bit, по средствами GDI вообще ничего не выводит, если же не присваивать, то выводится только 24битное изображение  smile 

Это сообщение отредактировал(а) gonzales - 25.7.2011, 13:28
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
gonzales
Дата 19.10.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 2



В общем сам одолел после многих мытарств

Код

var
  graphicsGDIPlus,g : TGPGraphics;
  bmp:TGPBitmap;
  mask:TGPImage;
  mask1:TGPBitmap;
  dst:TGPbitmap;
  sbd, dbd,mbd: TBitmapData;
  spscanline, dpscanline, mscanline: PByte;
  w, h, sstride, dstride,mstride, x, y: integer;
  spx: PRGBTriple;
  dpx: PRGBQuad;
  mpx:PRGBTriple;

begin
 bmp:= TGPBitmap.Create('имя файла изображения pf24');
 mask:= TGPImage.Create('имя файла маски pf24');

 w := bmp.GetWidth;
 h := bmp.GetHeight;


//создаем 32бит битмап
 dst:=TGPbitmap.Create(w,h,PixelFormat32bppARGB);

//растягиваем маску по изображению (если надо конечно)
 mask1:=TGPbitmap.Create(w,h,PixelFormat24bppRGB);
 g:=TGPGraphics.Create(mask1);
 g.DrawImage(mask,0,0,w,h);
 g.Free;

//лочим инфу во всех битмапах
 bmp.LockBits(MakeRect(0, 0, w, h), ImageLockModeRead,
                            PixelFormat24bppRGB, sbd);

 mask1.LockBits(MakeRect(0, 0, w, h), ImageLockModeRead,
                            PixelFormat24bppRGB, mbd);

 dst.LockBits(MakeRect(0, 0, w, h), ImageLockModeWrite,
                            PixelFormat32bppARGB, dbd);


//сканируем Bitmapdata
  spscanline := sbd.Scan0;
  sstride := sbd.Stride;

  mscanline := mbd.Scan0;
  mstride := mbd.Stride;

  dpscanline := dbd.Scan0;
  dstride := dbd.Stride;

  for y := 0 to h-1 do
  begin

    spx := PRGBTriple(spscanline);
    dpx := PRGBQuad(dpscanline);
    mpx := PRGBTriple(mscanline);

    for x := 0 to w-1 do
    begin
     dpx^.rgbBlue:=spx^.rgbtBlue;
     dpx^.rgbGreen:=spx^.rgbtGreen;
     dpx^.rgbRed:=spx^.rgbtRed;
     dpx^.rgbReserved:=255-mpx^.rgbtBlue;   //в байт прозрачности записываем то, что нужно, в данном случае синий канал из файла маски
      inc(spx);
      inc(dpx);
      inc(mpx);
    end;
    inc(spscanline,sstride);
    inc(dpscanline,dstride);
    inc(mscanline,mstride);
  end;

  bmp.UnlockBits(sbd);
  dst.UnlockBits(dbd);
  mask1.UnlockBits(mbd);


//dst - полученный 32битный битмап далее можем средствами GDI+ воспроизводить функцией DrawImage
mask1.Free;
dst.Free;
end;


Если у вас не выводится картинка, возможно ваши файлы не соответствуют PixelFormat24bppRGB
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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