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


Автор: Keeper89 12.4.2009, 00:41
Доброго времени суток!

Необходимо реализовать масштабирование картинки в файле до определенных размеров - т.е. загружаем картинку (не только BMP) из 1.??? и сохраняем масштабированную в файл 2.???.
Искал по форуму ответ, так толком ничего и не нашел.

Заранее благодарю.

Автор: Alexeis 12.4.2009, 11:21
Работаем по схеме 1.??? -> загрузили -> Конвертируем в памяти в BMP -> StretchDraw на новый битмап двойного размера -> конвертируем в исходный формат -> сохраняем в 2.???

Автор: Чупакабро 12.4.2009, 11:56
Вот пример для bmp, для jpg лень было делать

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bt1,bt2:tbitmap;
  scalex:single=2.0;
  scaley:single=2.0;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
begin
  if not fileexists('1.bmp') then exit;
  bt1:=tbitmap.Create;
  bt1.LoadFromFile('1.bmp');
  bt2:=tbitmap.Create;
  bt2.Width:=round(bt1.Width*scalex);
  bt2.Height:=round(bt1.Height*scaley);
  for i:=0 to bt2.Width-1 do
  begin
    for j:=0 to bt2.Height-1 do
    begin
      bt2.Canvas.Pixels[i,j]:=bt1.Canvas.Pixels[round(i/scalex),round(j/scaley)];
    end;
  end;
  bt2.SaveToFile('2.bmp');
  bt1.Free;
  bt2.Free;
end;

end.

Автор: Keeper89 12.4.2009, 13:03
Цитата(Чупакабро @  12.4.2009,  11:56 Найти цитируемый пост)
Вот пример для bmp, для jpg лень было делать


Спасибо, только заменил
Код

  for i:=0 to bt2.Width-1 do
  begin
    for j:=0 to bt2.Height-1 do
    begin
      bt2.Canvas.Pixels[i,j]:=bt1.Canvas.Pixels[round(i/scalex),round(j/scaley)];
    end;
  end;

на
Код

   bt2.Canvas.StretchDraw(rect(0, 0, bt2.Width, bt2.Height), bt1);

Получилось тоже самое.

Как сделать универсально для других типов рисунков? Например, конвертировать все в BMP как указал Alexeis?

Автор: Чупакабро 12.4.2009, 13:21
Для jpeg:
добавляешь в uses  модуль jpeg
вместо bt1 и bt2 (tbitmap) используешь рисунки image1, image2
их методы:
image1.Picture.LoadFromFile('1.jpg');
image2.Picture.SaveToFile('2.jpg');

вместо bt1.canvas.pixels используешь
image1.Canvas.Pixels

для второго рисунка аналогично.

Для других форматов файлов не знаю, может тоже модули есть наподобие jpeg.

А если нет, то придется писать конвертацию вручную, а для этого надо знать форматы файлов, как они там устроены.

Автор: Keeper89 12.4.2009, 15:14
Сделал через TImage, спасибо.

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