Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разработка функции масштабирования изображений в Delphi 11: исправление ошибки с сохранением размера

Delphi , Программа и Интерфейс , Размеры и Положение

 

В процессе разработки программного обеспечения на языке программирования Object Pascal (Delphi) часто возникает необходимость обработки изображений, включая их масштабирование. В данной статье мы рассмотрим проблему, связанную с масштабированием изображений и сохранением результата с правильными размерами, а также предложим решение и альтернативные подходы.

Описание проблемы

Вопрос был задан пользователем, который столкнулся с проблемой при попытке создать функцию для масштабирования изображений. Функция resizeImage должна была принимать исходный путь к файлу изображения, путь к файлу для сохранения результата и процент масштабирования. Однако, при сохранении нового файла размер изображения оставался таким же, как и у оригинального.

Оригинальное решение

В оригинальном решении использовался компонент TImage, который является контролом для отображения изображений в пользовательском интерфейсе. В коде была попытка изменить размеры контрола TImage, но это не влияло на размеры самого изображения. Это связано с тем, что TImage — это не просто контейнер для изображения, а компонент, который отображает изображение на экране. Изменение размеров контрола не влияет на размеры графического объекта внутри него.

Исправленное решение

Для исправления ошибки, пользователь предложил следующее решение:

function resizeImage(src, dst: string; perc: integer): string;
var
  im, im2: timage;
  w, h: integer;
  xt: string;
  scale: double;
  bmp: TBitmap;
begin
  Result := '';
  try
    if fileexists(src) then
    begin
      xt := src;
      delete(xt, 1, pos('.', xt) - 1);
      if pos('.', dst) = 0 then
        dst := dst + xt;

      im := timage.create(self);
      im.Picture.LoadFromFile(src);
      im2 := timage.Create(self);
      scale := perc / 100;
      bmp := TBitmap.create;
      try
        bmp.Width := round(im.Picture.Width * scale);
        bmp.Height := round(im.Picture.Height * scale);
        bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, im.Picture.Graphic);
        bmp.Canvas.draw(0, 0, bmp);
        im2.Picture.Assign(bmp);
        im2.Picture.SaveToFile(dst);
      finally
        im.free;
        im2.Free;
        bmp.free;
      end;
      Result := dst;
    end;
  except
    on e: exception do
    begin
      showmessage('Resize img perc ' + inttostr(perc) + ' error : ' + e.message);
    end;
  end;
end;

В этом решении используется TBitmap для создания нового изображения с нужными размерами, а затем копирование изображения из исходного TImage в новый TBitmap. Новое изображение затем сохраняется в файл с правильными размерами.

Анализ исправленного решения

Хотя исправленное решение работает, оно использует несколько лишних шагов и объектов. Вместо использования TImage, можно напрямую работать с изображением, используя TBitmap, что сделает код более чистым и эффективным.

Альтернативное решение

Для упрощения и повышения эффективности, можно использовать TBitmap напрямую, без создания дополнительных TImage объектов. Вот альтернативное решение:

function ResizeImage(src, dst: string; perc: integer): string;
var
  bmp: TBitmap;
  scale: Double;
  w, h: Integer;
begin
  Result := '';
  bmp := TBitmap.Create;
  try
    if FileExists(src) then
    begin
      bmp.LoadFromFile(src);
      scale := perc / 100;
      w := Round(bmp.Width * scale);
      h := Round(bmp.Height * scale);
      bmp.SetSize(w, h);
      bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, bmp);
      if Pos('.', dst) = 0 then
      begin
        Result := dst + ExtractFileExt(src);
      end
      else
      begin
        Result := dst;
      end;
      bmp.SaveToFile(Result);
    end
    else
    begin
      ShowMessage('Файл не существует');
    end;
  finally
    bmp.Free;
  end;
end;

Преимущества альтернативного решения

  1. Простота и чистота кода: В альтернативном решении используется только один объект TBitmap, что упрощает понимание и поддержку кода.
  2. Эффективность: Избегание создания дополнительных объектов и использование только необходимых методов делает код более эффективным.
  3. Легкость в использовании: Функция принимает три параметра: путь к исходному изображению, путь к выходному файлу и процент масштабирования, что делает её легко интегрируемой в другие части программы.

Пример использования

Для использования функции ResizeImage можно написать следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  resizedImagePath: string;
begin
  resizedImagePath := ResizeImage('c:imagesoriginal.jpg', 'c:imagesresized.jpg', 50);
  if resizedImagePath <> '' then
    ShowMessage('Изображение успешно масштабировано и сохранено по пути: ' + resizedImagePath)
  else
    ShowMessage('Ошибка при масштабировании изображения');
end;

Заключение

В данной статье мы рассмотрели проблему масштабирования изображений в Delphi и предложили несколько решений. Оригинальное решение использовало TImage, что приводило к лишним шагам и объектам. Альтернативное решение с использованием TBitmap является более эффективным и простым. Мы надеемся, что эта статья поможет вам в разработке функций для обработки изображений в Delphi.

Если у вас есть дополнительные вопросы или предложения, пожалуйста, оставьте комментарий.

Создано по материалам из источника по ссылке.

Context: В статье рассматриваются проблемы и решения для масштабирования изображений в Delphi, сравниваются оригинальное и альтернативное решение, и предлагается более эффективный подход с использованием TBitmap.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Размеры и Положение ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-22 18:13:27/0.0036220550537109/0