Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 14

Как сделать Bitmap в виде скругленного прямоугольника и прозрачным фоном за пределами этого прямоуголника

19.04.2020, 16:07. Показов 4573. Ответов 24

Студворк — интернет-сервис помощи студентам
Добрый день, нужна помощь. Требуется с графического файла (bmp, jpeg и прочих) нарисовать на CANVAS (на канве нужного контролла, для примера можно даже и на форме) это изображение, но ограниченное закругленным прямоугольником и чтобы все что находится за пределами этого прямоугольника было прозрачным. Желательно такого же размера, что и файл. Т.е. нужно просто картинку скруглить как бы, а остальное сделать прозрачным.
Заранее спасибо, надеюсь на вашу помощь.
Миниатюры
Как сделать Bitmap в виде скругленного прямоугольника и прозрачным фоном за пределами этого прямоуголника  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2020, 16:07
Ответы с готовыми решениями:

Как сделать кнопку с прозрачным фоном
Уважаемые форумчане! Подскажите, можно ли сделать прозрачную кнопку, такую чтобы вместо ее фона было видно то, что находится "под...

Как сделать кнопку с прозрачным фоном
Привет! Вот хочу у вас спросить как сделать прозрачную кнопку! Например: Вставить Изображение(На кнопку)(Button) И внизу написать...

Как сделать просмотр изображений с прозрачным фоном?
Всем доброе утро, я пытаюсь сделать сайт по шаблону от wix, на одной из страниц я встретился с проблемой, это просмотр изображений при...

24
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 14
28.04.2020, 06:39  [ТС]
Студворк — интернет-сервис помощи студентам
Изначально и был на основе TGraphicControl. Но намучившись, наэксперементировавшись с рисованием сделал через TGraphicControl, чтобы применить регионы, т.к. с TGraphicControl у меня не получалось использовать handle для передачи параметра в SetWindowRgn(MButArray[i].Handle,rgn1,true);

Вот мой код, знаю что он корявый, никогда не делал свои контроллы, но не нашел способа как решить данную задачу со стандартным набором. Может постепенно и доведу его до ума.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
unit MenuButton2;
 
interface
 
uses
  SysUtils, Classes, Controls, StdCtrls,math, Graphics, Windows, messages, GdiPlus, ActiveX,Types,
   pngimage, ExtCtrls, vcl.dialogs;
type
   TMenuButton2 = class(TCustomControl)
  private
    FOnPaint: TNotifyEvent;
    FRadius:Integer;
    FColor:TColor;
    FCaption:TCaption;
    FSelected:Boolean;
    FCornerCaption : String;
    FFontSize:word;
    FPriceFontSize:word;
    FDown:boolean;
    FUsed:boolean;
    FCornerInverse : Boolean;
    FTitleColor:TColor;
    FBorderWidth:byte;
    FImage:Graphics.TBitmap;
    FImageType:string;
 
    procedure SetCaption(value: TCaption);
    procedure SetImage(value: Graphics.TBitmap);
    procedure SetRadius(value: integer);
    procedure SetColor(value: TColor);
    procedure SetSelected(value: Boolean);
    procedure SetFCornerText(Value: string);
    procedure SetFontSize(value: word);
    procedure SetPriceFontSize(value: word);
    procedure SetUsed(value: Boolean);
    procedure SetTitleColor(value: TColor);
    procedure SetBorderWidth(value:byte);
    procedure SetImageType(value:String);
    { Private declarations }
  protected
    { Protected declarations }
    procedure Paint;override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:  Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  public
    { Public declarations }
    constructor Create(AOWner: TComponent);override;
    destructor Destroy;override;
    property Canvas;
    procedure Click; override;
    procedure DblClick; override;
  published
    property Caption: TCaption read FCaption Write SetCaption;
    property Image: Graphics.TBitmap read FImage Write SetImage;
    property Radius:integer read FRadius Write SetRadius;
    property Color:TColor read FColor Write SetColor;
    property Selected:Boolean read FSelected Write SetSelected;
    property CornerCaption : String read FCornerCaption write SetFCornerText;
    property FontSize:word read FFontSize write SetFontSize;
    property PriceFontSize:word read FPriceFontSize write SetPriceFontSize;
    property Used:Boolean read FUsed write SetUsed;
    property ShowHint;
    property Visible;
    property Enabled;
    property Cursor;
    property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
    property OnClick;
    property CornerInverse : Boolean read FCornerInverse write FCornerInverse default false;
    property TitleColor:TColor read FTitleColor Write SetTitleColor;
    property BorderWidth:Byte read FBorderWidth Write SetBorderWidth;
    property ImageType:String read FImageType Write SetImageType;
end;
 
 
 
procedure Register;
 
implementation
 
.......................................................
function GetScaledCenteredBitmap(bmp:Graphics.TBitmap; maxWidth, maxHeight: integer):  Graphics.TBitmap;
var
    sbmp: Graphics.TBitmap;
  scaledWidth, scaledHeight: integer;
begin
  scaledWidth := 0;
  scaledHeight := 0;
 
  sbmp := Graphics.TBitmap.Create;
 
  if bmp.Width > bmp.Height then
  begin
    scaledHeight := trunc(maxWidth * bmp.Height / bmp.Width);
    scaledWidth := maxWidth;
  end
  else if bmp.Height >= bmp.Width then
  begin
    scaledWidth := trunc(maxHeight * bmp.Width / bmp.Height);
    scaledHeight := maxHeight;
  end;
 
  sbmp.Width := maxWidth;
  sbmp.Height := maxHeight;
  //sbmp.Canvas.Brush.Color := clBlack;
  //sbmp.Canvas.FillRect(Bounds(0, 0, maxWidth, maxHeight));
  sbmp.Canvas.StretchDraw(Bounds(maxWidth div 2 - scaledWidth div 2, maxHeight div 2 -
    scaledHeight div 2, scaledWidth, scaledHeight), bmp);
  result := sbmp;
  bmp.Free;
end;
 
procedure TMenuButton2.Paint;
var
   GPPen: TGPPen;
   GPColor: TGPColor;
   GPLColor: TGPColor;
   GPFColor: TGPColor;
   GPGraphics: IGPGraphics;
 
   GPGraphicsPath: IGPGraphicsPath;
   GFont       : TGPFont;
   GFont2 : TGPFont;
   GPSolidBrush: TGPSolidBrush;
   SolidBrush    : TGPSolidBrush;
   SolidBrush2    : TGPSolidBrush;
   RectTitle : TGPRectF;
   strformat:IGPStringFormat;
   gImage : TGPImage;
   RectImg : TGPRectF;
   aptr: IStream;
   BitMapStream:TMemoryStream;
   sbmp:Graphics.TBitmap;
   scaledWidth, scaledHeight: integer;
begin
  try
   inherited;
    //Настройки выравнивания текста
    strformat:=TGPStringFormat.Create([]);
    strformat.Alignment  :=StringAlignmentCenter;
    strformat.LineAlignment:=StringAlignmentCenter;
 
    //Настройки сглаживания
    GPGraphics := TGPGraphics.Create(Canvas.Handle);
    GPGraphics.SmoothingMode := SmoothingModeAntiAlias;
 
 
 
    //рисование RoundRect
    GPGraphicsPath := TGPGraphicsPath.Create;
    GPGraphicsPath.Reset;
    GPGraphicsPath.AddArc(0, 0, Radius, Radius, 180, 90);
    GPGraphicsPath.AddArc(ClientWidth - Radius - 1, 0, Radius, Radius, 270, 90);
    GPGraphicsPath.AddArc(ClientWidth - Radius - 1, ClientHeight - Radius - 1,     Radius, Radius, 0, 90);
    GPGraphicsPath.AddArc(0, ClientHeight - Radius - 1, Radius, Radius, 90, 90);
    GPGraphicsPath.CloseFigure;
 
    case FUsed of
      false:
          case FSelected of
                true:
                      begin
                        GPColor.InitializeFromColorRef(ColorToRGB(color));
                        GPColor.Alpha := 255;
                        GPLColor.InitializeFromColorRef(ColorToRGB(clYellow)); //Цвет линий
                        GPLColor.Alpha := 255;
                        GPPen := TGPPen.Create(GPLColor,FBorderWidth); //Pen для Границ
                      end;
                false:
                      begin
                        GPColor.InitializeFromColorRef(ColorToRGB($00ffffff));
                        GPColor.Alpha := 125;
                        GPLColor.InitializeFromColorRef(ColorToRGB($00ffffff)); //Цвет линий
                        GPLColor.Alpha := 125;
                        GPPen := TGPPen.Create(GPLColor,0); //Pen для Границ
                      end;
          end;
      true:
            begin
              case FDown of
                true:
                      begin
                        GPColor.InitializeFromColorRef(ColorToRGB(Darker(color,10)));
                        GPColor.Alpha := 255;
                        GPLColor.InitializeFromColorRef(ColorToRGB(Darker(color,10))); //Цвет линий
                        GPLColor.Alpha := 255;
                        GPPen := TGPPen.Create(GPLColor,0); //Pen для Границ
                      end;
                false:
                      begin
                        GPColor.InitializeFromColorRef(ColorToRGB(color));
                        GPColor.Alpha := 255;
                        GPLColor.InitializeFromColorRef(ColorToRGB(color)); //Цвет линий
                        GPLColor.Alpha := 255;
                        GPPen := TGPPen.Create(GPLColor,0); //Pen для Границ
                      end;
              end;
           end;
    end;
 
 
 
    if FCornerInverse then GPFColor.InitializeFromColorRef(ColorToRGB(InverseColor(self.Color)))else
    GPFColor.InitializeFromColorRef(ColorToRGB(VisibleContrast(self.Color)));
 
    SolidBrush := TGPSolidBrush.Create(GPFColor);// SolidBrush для заголовка
    GPSolidBrush := TGPSolidBrush.Create(GPColor); //SolidBrush для заливки фигуры
 
    GPGraphics.FillPath(GPSolidBrush, GPGraphicsPath);    //Закрашиваем фигуру RoundRect
    GPGraphics.DrawPath(GPPen, GPGraphicsPath);           //Рисуем круглые края
    if (FImage<>nil) and (not FImage.Empty)  then
    begin
      try
        if ImageType.ToLower<>'png' then//GetScaledCenteredBitmap не масштабирует и не центрирует png формат :(
        begin
          FImage:=GetScaledCenteredBitmap(fImage,Width,Round(2*Height/3));
          Canvas.Draw(0,0,FImage);
        end else
          begin
            if fImage.Width > fImage.Height then
            begin
              scaledHeight := trunc(Width * fImage.Height / fImage.Width );
              scaledWidth := Width;
            end
            else if fImage.Height >= fImage.Width then
            begin
              scaledWidth := trunc((2*Height/3) * fImage.Width / fImage.Height);
              scaledHeight := trunc(2*Height/3);
            end;
 
            if scaledHeight>trunc(2*Height/3) then scaledHeight:=trunc(2*Height/3);
 
            Canvas.StretchDraw(Bounds(Width div 2 - scaledWidth div 2, trunc(2*Height/3) div 2 - scaledHeight div 2, scaledWidth, scaledHeight), fImage);
         end;
 
 
        //FImage.SetSize(Width,Round(2*Height/3));
        //BitMapStream := TMemoryStream.Create;
        //FImage.SaveToStream(BitMapStream);
        //aptr :=TStreamAdapter.Create(BitMapStream, soReference) as IStream;
        //gImage := TGPImage.Create(aptr,true); //создаем класс используя поток
        RectImg.X:=0;
        RectImg.Y:=0;
        RectImg.Width:=Width;
        RectImg.Height:=Round(2*Height/3);
        //FImage.SetSize(Width,Round(2*Height/3));
        //GPGraphics.DrawImage(gImage,RectImg,0,0,RectImg.Width,RectImg.Height,UnitPixel);
 
      finally
        //FreeAndNil(Gimage);
        //FImage.Free;
        //FreeAndNil(BitMapStream );
      end;
 
      RectTitle.X:=FBorderWidth;
      RectTitle.Y:=round(2*(Height/3));
      RectTitle.Width:=Width-FBorderWidth;
      RectTitle.Height:=Height-round(2*(Height/3));
    end else
      begin
        RectTitle.X:=FBorderWidth;
        RectTitle.Y:=FBorderWidth;
        RectTitle.Width:=Width-FBorderWidth;
        RectTitle.Height:=Height-FBorderWidth;
      end;
    //Настройки шрифта
    GFont:= TGPFont.Create(TGPFontFamily.Create('Arial'), FFontSize, [FontStyleBold], UnitPixel);
    GPGraphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
    GPGraphics.DrawString(caption,GFont, RectTitle,strformat, solidBrush);//Вывод заголовка
    GPFColor.Alpha := 255;
    SolidBrush2 := TGPSolidBrush.Create(GPFColor);
 
    strformat.Alignment:=StringAlignmentFar;
    strformat.LineAlignment:=StringAlignmentFar;
    RectTitle.X:=FBorderWidth;
    RectTitle.Y:=FBorderWidth;
    RectTitle.Width:=Width-FBorderWidth-6;
    RectTitle.Height:=Height-FBorderWidth-6;
 
    GFont2:= TGPFont.Create(TGPFontFamily.Create('Arial'), FPriceFontSize, [FontStyleBold], UnitPixel);
    GPGraphics.DrawString(FCornerCaption,GFont2, RectTitle,strformat, solidBrush2);
 
    FreeAndNil(GPPen);
    FreeAndNil(GPSolidBrush);
    GPGraphicsPath:=nil;
    FreeAndNil(GFont);
    FreeAndNil(GFont2);
 
    FreeAndNil(SolidBrush);
    FreeAndNil(SolidBrush2);
    strformat:=nil;
    GPGraphics:=nil;
 
  except
    on E: Exception do
      raise Exception.Create('Ошибка MenuButton2: '+E.Message);
  end;
 
end;
Использование GDI+ разрешено?
GdiPlus у меня используется.


Изначально я рисовал кнопку закругленной с помощью GPGraphicsPath. Потом понадобилось добавить рисунок и понеслось.. Как-то так. Спасибо большое, что тратите время на это.

Функция GetScaledCenteredBitmap почему-то не работает с png изображениями.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
28.04.2020, 18:07
Так это же и хорошо! Надо было сразу сказать тока про GDI+.
TGPGraphicsPath по идее можно не только закрашивать, но и использовать в качестве региона отсечения.
Правда я тут что-то похожее намастерил для тестирования - так-то работает, но ожидаемого сглаживания чё-то не выходит, пока не могу понять почему вдруг...
Delphi
1
2
    GPGraphics.FillPath(GPSolidBrush, GPGraphicsPath);    //Закрашиваем фигуру RoundRect
    GPGraphics.DrawPath(GPPen, GPGraphicsPath);           //Рисуем круглые края
А можно вот так ещё:
Delphi
1
2
GPGraphics.SetClip(GPGraphicsPath);
GPGraphics.DrawImage(GPImage, ... );
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
29.04.2020, 03:43
Функция GdiAlphaBlend тоже неплохо это делает. Только ей нужно подавать подготовленный источник.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
29.04.2020, 21:09
Попробовал вместо TGPGraphicsPath задавать отсечение через HRGN - такая же фигня выходит, да даже похуже стало.

хм... Чё-то похоже в GDI+ нету ROP-операций типа SRCAND/SRCPAINT/MERGEPAINT...
Просто при работе с GDI+ мне никогда такое и не надобилось, но я как-то автоматически полагал что оно должно уметь. А вона оказалося что нет...
Операций типа "наложить картинку не затрагивая альфа-канал" или "использовать альфу кисти" тоже что-то не нашёл...

Не хочется лазить в сами пиксели. Хочется найти решение чтоб более штатно получалось...
Через SetRemapTable() можно всё что угодно, но для данной задачи не пойдёт - будет словно забивать один гвоздь четырьмя миллиардами молотков...
Пробую колдовать с SetColorMatrix(), но задуманное никак не хочет работать, обнуляет каналы где как раз было не надо.
Точной формулы происходящего при её использовании не нашёл, а без этого местами непонятно.

Вопросы по вашему коду:
  • Вы написали что используете Delphi 10.3, тогда почему вы используете сторонний модуль GdiPlus, а не встроенные модули? Нет, это хороший модуль, надёжный, удобнее, с интересными решениями, но он местами не совместим со встроенными. Может аукнуться позже.
  • Может хранение и создание объектов типа TGPStringFormat и прочих вынести из OnPaint? Хотя тут смотря как взвешивать приоритеты скорость/память.
  • Внутри вашего компонента вы храните картинку в виде TBitmap из VCL. И ещё храните строку FImageType. В которой видимо расширение файла? Какого файла? И которое почему-то может быть 'png'? Под виндой VCL хранит битмапы как GDI32-объекты. Внутри TBitmap не может быть png.
  • Далее, функция GetScaledCenteredBitmap() в связке с проверкой на 'png' вызывает ещё большие сомнения... То есть, если в поле FImageType окажется "не png", то при каждом рисовании будет производиться создание нового битмапа и копирование содержимого со старого? Зачем каждый раз это делать? Затрата ресурсов. Да и рисуете вы через GDI+, почему бы и картинку не рисовать им же? Тогда может лучше и хранить как TGPImage или TGPBitmap? Как/откуда поступает содержимое картинки? Предполагается ли изменять само содержимое картинки после её загрузки в компонент?
  • У вас кажется некоторая путаница с ColorToRGB() и какими-то Darker()/InverseColor()/VisibleContrast() которые без кода. При передачи цвета в метод InitializeFromColorRef() (которого кстати нет в стандартных модулях) делать ColorToRGB() не нужно - он сам это сделает если потребуется. Но есть подозрение, что остальные три функции ожидают цвет как раз обработанный ColorToRGB(), а им передают без. Может цвета тоже хранить как TGPColor?

Добавлено через 19 минут
При режиме CompositingModeSourceCopy сглаживание также отрубается полностью... Безобразие...
Проще уже создать временный битмап, создать для него битмап-маску и слазить в пиксели...

Добавлено через 4 минуты
Delphi
1
property Image: Graphics.TBitmap Read FImage Write SetImage;
Вам точно нужно Read? Может можно только Write? Ну или можно ли оставить лишь публичый SetImage()?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
29.04.2020, 21:52
Наваял пару функций для подготовки битмапа с альфа-каналом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
procedure PremultiplieAlpha(bmSrc, bmMask: TBitmap);
var
  x, y, x4, mx: integer;
  pbS, pbM: PByteArray;
begin
  // Функция GdiAlphaBlend принимает на вход предварительно умноженные на значение Alpha значения пикселей
  // Предварительная подготовка источника для использования в GdiAlphaBlend
  bmSrc.PixelFormat := pf32bit; // Обязательно 32 бит для нашей рамки
  bmMask.PixelFormat := pf32bit; // Обязательно 32 бит для нашей рамки
  bmMask.Width  := bmSrc.Width ;
  bmMask.Height := bmSrc.Height;
 
  mx := bmSrc.Width*bmSrc.Height*4;
  pbS := bmSrc.ScanLine[bmSrc.Height-1];
  pbM := bmMask.ScanLine[bmSrc.Height-1];
  x4 := 0;
  while x4 < mx do begin
    x := pbM^[x4]; // Берём значение маски из видимой части пикселя
    pbS^[x4  ] := (pbS^[x4  ] * x) div 255; // Предварительное умножение на alpha
    pbS^[x4+1] := (pbS^[x4+1] * x) div 255;
    pbS^[x4+2] := (pbS^[x4+2] * x) div 255;
    pbS^[x4+3] := x; // Установка значения alpha для пикселя
    x4 := x4 + 4;
  end;{}
end;
 
 
procedure PrepareRoundRectFrame(bmSrc: TBitmap; Round: integer);
var
  bmapm, bmapt: TBitmap;
begin
  // Создать промежуточный увеличенный битмап для маски
  bmapt := TBitmap.Create;
  bmapt.PixelFormat := pf32bit; // Желательно 32 бит для уменьшения переменных и вычислений
  bmapt.Canvas.Brush.Color := clBlack;  // Залить чёрным
  bmapt.Width  := bmSrc.Width *2; // Если не хватает плавности, можно увеличить в 3 раза
  bmapt.Height := bmSrc.Height*2;
  // Сделать белый прямоугольник с закруглёнными углами
  bmapt.Canvas.Brush.Color := clWhite;
  bmapt.Canvas.Pen.Color := clWhite;
//  bmapt.Canvas.Pen.Color := clGray; // Вариант для плавного перехода
  bmapt.Canvas.RoundRect(0, 0, bmapt.Width, bmapt.Height, Round, Round);
 
  // Создать битмап для маски размером с источник
  bmapm := TBitmap.Create;
  bmapm.Width  := bmSrc.Width ;
  bmapm.Height := bmSrc.Height;
  bmapm.PixelFormat := pf32bit; // Желательно 32 бит для уменьшения переменных и вычислений
 
  SetStretchBltMode(bmapm.Canvas.Handle, HALFTONE); // Установить режим со сглаживанием
  // Уменьшить маску со сглаживанием до размера источника
  StretchBlt(bmapm.Canvas.Handle, 0, 0, bmapm.Width, bmapm.Height,
             bmapt.Canvas.Handle, 0, 0, bmapt.Width, bmapt.Height, SRCCOPY);
  bmapt.Free;
 
  // Функция GdiAlphaBlend принимает на вход предварительно умноженные на значение Alpha значения пикселей
  // Подготовить источник в соответствии с маской
  PremultiplieAlpha(bmSrc, bmapm);
 
  bmapm.Free;
end;
И использование:
Delphi
1
2
3
  PrepareRoundRectFrame(bmSrc, ScrollBar1.Position); // Второй параметр задаёт диаметр (или радиус?) закруглений
  // Предварительно bmDest заполняется нужным фоном.
  GdiAlphaBlend(bmDest.Canvas.Handle, 0, 0, bmSrc.Width, bmSrc.Height, bmSrc.Canvas.Handle, 0, 0, bmSrc.Width, bmSrc.Height, (255 shl 16)+$01000000);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2020, 21:52

Как сделать шахматные фигуры с прозрачным внешним фоном?
Суть такая: делаю шахматы на питоне с tkinter. Поле у меня - 8х8 клеток, в каждой клетке - картинка (PhotoImage) с изображением клетки :) ...

Как сделать так, чтобы gif анимация 1920х1080 с прозрачным фоном была поверх всех окон?
Как сделать так, чтобы gif анимация 1920х1080 с прозрачным фоном была поверх всех окон? Чтобы можно было наблюдать за ней (это мигающий...

Создать правило для абзаца с собственным фоном, прозрачным фоном
Подскажите пожалуйста, как нужно выполнить задание?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru