Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2021, 04:08   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Прорисовка прозрачного и рястянутого PNG

Всем доброго времени суток, уважаемые эксперты. Есть проект, в котором состоит задача в том, чтобы вывести картинки различных форматов на форме с прозрачностью и растягиванием. Формат bmp и jpg выводятся отлично - без проблем. Для вывода картинок формата Png использую библиотеку PngImage.

Код:
Png:TPNGObject;
Загружаю картинку так:
Код:
  path:=ExtractFileDir(Application.ExeName);  
  PNG:=TPNGObject.Create;
  Png.Transparent:=True;
  Png.LoadFromFile(path+'\img\menu\Name.png');
Когда я просто вывожу png картинку через bitblt - все работает отлично/ Когда пытаюсь растянуть картинку png и вывести, тоже работает отлично вот так:

Код:
TransparentBlt(B.Canvas.Handle, 0, 0, 1280, 690, Png.Canvas.Handle, 0, 0, Png.Width, Png.Height, clBlack);
Начинаются проблемы когда я пытаюсь вывести картинку одновременно и растянутую и с прозрачностью. Применяю для этого TransparentStretchBlt, пробовал задавать различные параметры, но всегда рисуется не правильно. Ниже прилагаю варианты некоторые:

Код:
TransparentStretchBlt(B.Canvas.Handle, 700,200,540,50,   Png.Canvas.Handle, 0,0,Png.Width,Png.Height,0,0,0); //так плохо видно
B.Canvas.StretchDraw(Rect(700,200,1240,250),Png); //Так видно хорошо
TransparentStretchBlt(B.Canvas.Handle, 700,200,540,50,   Png.Canvas.Handle, 0,0,Png.Width,Png.Height,Png.Canvas.Handle,0,SRCPAINT); //так рисует всю картинку без прозрачности
TransparentStretchBlt(B.Canvas.Handle, 700,200,540,50,   Png.Canvas.Handle, 0,0,Png.Width,Png.Height,Png.Canvas.Handle,0,0); //так рисует не правильно с прозрачным центром
Прилагаю и картинку, что получается в итоге. Последние 3 цифры - это задание маски и не задавать ее не дает. Как ее правильно задавать, если маску я не делал?

Код:
function TransparentStretchBlt(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
                                                    SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; 
                                                    MaskDC: HDC; MaskX, MaskY: Integer): Boolean;
Вопрос как правильно указать параметры для вывода картинки или может есть другие варианты вывода? Canvas.StretchDraw не применяю, так как у него в теории скорость работы меньше
Изображения
Тип файла: jpg видно так.jpg (96.8 Кб, 36 просмотров)
Тип файла: jpg так должно быть.jpg (62.6 Кб, 36 просмотров)
Тип файла: jpg так с scrpaint.jpg (69.7 Кб, 36 просмотров)

Последний раз редактировалось Armageddets; 18.07.2021 в 12:00.
Armageddets вне форума Ответить с цитированием
Старый 18.07.2021, 14:51   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

На Delphi7 я использовал следующий код
Код:
  Png:=TPngObject.Create;
  BitmapToPng(ImageControl.Image.Bitmap, png, False);
  png.CreateAlpha;
  Png.Draw(Canvas, Rect1);
  png.Destroy;
В TPngObject уже реализовано как надо. Хотя и не самым лучшим способом.

Цитата:
{Draws the image into a canvas}
procedure TPngObject.Draw(ACanvas: TCanvas; const Rect: TRect);
var
Header: TChunkIHDR;
begin
{Quit in case there is no header, otherwise obtain it}
if Empty then Exit;
Header := Chunks.GetItem(0) as TChunkIHDR;

{Copy the data to the canvas}
case Self.TransparencyMode of
{$IFDEF PartialTransparentDraw}
ptmPartial:
DrawPartialTrans(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect);
{$ENDIF}
ptmBit: DrawTransparentBitmap(ACanvas{$IFDE F UseDelphi}.Handle{$ENDIF},
Header.ImageData, Header.BitmapInfo.bmiHeader,
pBitmapInfo(@Header.BitmapInfo), Rect,
{$IFDEF UseDelphi}ColorToRGB({$ENDIF}Transp arentColor)
{$IFDEF UseDelphi}){$ENDIF}
else
begin
SetStretchBltMode(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, COLORONCOLOR);
StretchDiBits(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect.Left,
Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, 0, 0,
Header.Width, Header.Height, Header.ImageData,
pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS, SRCCOPY)
end
end {case}
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 18.07.2021, 16:31   #3
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Спасибо огромное за помощь. Для моего примера даже не понадобилась строка
Код:
png.CreateAlpha;
Даже с вот этой строкой отлично сработало с прозрачностью и растягиванием:
Код:
Png.Draw(B.Canvas, Rect(700,200,1240,250));
Armageddets вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наложить png на png Gudzik11 Общие вопросы Delphi 11 11.01.2014 19:49
Проблема при загрузке на форму прозрачного gif изображения! Yazon2006 Мультимедиа в Delphi 8 04.07.2011 18:08
Прорисовка ListView akosh12345 Компоненты Delphi 6 04.06.2010 00:55
с# прорисовка MAcK Общие вопросы .NET 1 29.08.2008 16:48