Вопрос Как растянуть bmp в inno и сохранить?

Статус
В этой теме нельзя размещать новые ответы.

sergey3695

Ветеран
Модератор
Что-то не могу сообразить.
Сохранение:
Bitmap.SaveToFile(ExpandConstant('{src}\1.bmp'));
А вот как растянуть?
 

Snoopak96

Старожил
Код:
const
SRCCOPY = $CC0020;
HALFTONE = 4;

function StretchBlt(DestDC: LongInt; X, Y, Width, Height: Integer; SrcDC: LongInt; XSrc, YSrc, SrcWidth, SrcHeight: Integer; Rop: DWORD): Boolean; external 'StretchBlt@gdi32.dll stdcall';
function BitBlt(DestDC: LongWord; X, Y, Width, Height: Integer; SrcDC: LongWord; XSrc, YSrc: Integer; Rop: DWORD): BOOL; external 'BitBlt@gdi32 stdcall';
function SetStretchBltMode(DC: LongWord; StretchMode: Integer): Integer; external 'SetStretchBltMode@gdi32.dll stdcall';
function SetBrushOrgEx(hdc: Longint; nXOrg, nYOrg: Integer; var lppt: TPoint): BOOL; external 'SetBrushOrgEx@gdi32.dll stdcall';

procedure ResizeBMP(ABitMap: TBitmap; ANewWidth, ANewHeight: Integer);
var
tmpBmp:  TBitmap;
divHeight,
divWidth:  double;
pt: TPoint;
begin
tmpBmp := TBitmap.Create;
try
  tmpBmp.Width := ABitMap.Width;
  tmpBmp.Height := ABitMap.Height;
  BitBlt(tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height,
  ABitMap.Canvas.Handle, 0, 0, SRCCOPY);
  divHeight := ABitMap.Height / ANewHeight;
  divWidth := ABitMap.Width / ANewWidth;
  if (divHeight = 1.0) and (divWidth = 1.0) then
  begin 
  ANewWidth := ABitMap.Width;
  ANewHeight := ABitMap.Height;
  end
  else if divHeight > divWidth then
  begin 
  ANewWidth := trunc(ABitMap.Width / divHeight);
  end
  else
  begin
  ANewHeight := trunc(ABitMap.Height / divWidth);
  end;
  ABitMap.Width := ANewWidth;
  ABitMap.Height := ANewHeight;
  SetStretchBltMode(ABitMap.Canvas.Handle, HALFTONE);
  SetBrushOrgEx(ABitMap.Canvas.Handle, 0, 0, pt);
  StretchBlt(ABitMap.Canvas.Handle, 0, 0, ABitMap.Width, ABitMap.Height,
  tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height, SRCCOPY);
finally
  tmpBmp.Free;
end;
end;

procedure InitializeWizard();
var img: TBitmapImage;
begin
  img := TBitmapImage.Create(WizardForm);
  img.Parent := WizardForm.WelcomePage;
  img.Bitmap.LoadFromFile('C:\Program Files (x86)\Inno Setup 5\Examples\BGImage.bmp');
  img.SetBounds(ScaleX(0), ScaleY(0), ScaleX(250), ScaleY(250));

  ResizeBMP(img.Bitmap, 200, 200);

end;
Дорабатывай условие сам т.к. мне это не интересно.
 

Snoopak96

Старожил
1. кисть в 0 ставит
2. StretchBlt - копирует с маштабированием

после масштабирования BitBlt`ом скопируй, только целевое укажи меньше какое тебе надо, само всё и подрежится

ЗЫ Хотя и StretchBlt тоже просчитать можно, только лень и я не понимаю за каким чёртом тебе это понадобилось :pardon:
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Да все норм режет. Я не правильно указывал. Спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху