Как сделать эскиз из JPG или PNG и загрузить его в элемент управления Timage?

Почему вы не первый раз переименовываете удаляемый файл, а затем удаляете его?

Используйте GetTempFileName() для получения уникального имени, затем используйте MoveFile() для переименования файла. Затем удалите переименованный файл. Если фактическое удаление действительно асинхронно и может конфликтовать с созданием одного и того же файла (как показывают ваши тесты), это должно решить проблему.

Редактирование: Конечно, если ваш анализ прав, и файловые операции происходят несколько асинхронно, это может привести к проблеме, которую вы пытаетесь удалить файл до того, как будет выполнено переименование. Но тогда вы всегда можете попытаться удалить фоновый поток.

Редактировать # 2: Если Ганс прав (и я склонен верить его анализу), то перемещение может не помочь, потому что вы не сможете фактически переименовать файл, открытый другим процессом. (Но тогда вы могли бы, я не знаю этого.) Если это действительно так, единственный способ, который я могу придумать, - «продолжать пытаться». Вам придется подождать несколько миллисекунд и повторить попытку. Храните тайм-аут, чтобы отказаться, когда это не поможет.

0
задан Remy Lebeau 3 March 2019 в 10:28
поделиться

1 ответ

TBitmap VCL поддерживает только изображения BMP. Если вы попытаетесь загрузить в него любое другое изображение, вы получите исключение.

Чтобы загрузить JPG, вам нужно использовать TJPEGImage . Чтобы загрузить PNG, используйте вместо этого TPNGImage .

Вы можете использовать TPicture , чтобы помочь вам с этой задачей, например:

uses
 ..., Vcl.Graphics, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage;

function resize2(source: string): TBitmap;
var
  Pic: TPicture;
begin
  Pic := TPicture.Create;
  try
    Pic.LoadFromFile(source);
    Result := TBitmap.Create;
    try
      if Pic.Graphic is TBitmap then
        Result.PixelFormat := TBitmap(Pic.Graphic).PixelFormat
      else
        Result.PixelFormat := pf32bit;
      Result.Width := 10;
      Result.Height := 10;
      Result.Canvas.StretchDraw(Rect(0, 0, Result.Width, Result.Height), Pic.Graphic);
    except
      Result.Free;
      raise;
    end;
  finally
    Pic.Free;
  end;
end;

procedure TAlpha.dbeditTextBoxChange(Sender: TObject);
var
  pic1: string;
  mimapa: TBitmap;
begin
  try
    pic1 := dm.TableNotes.FieldByName('PathPic').AsString;
    mimapa := resize2(pic1);
    try
      image2.Picture.Assign(mimapa);
    finally
      mimapa.Free;
    end;
    ...
  except
   ...
  end;
end;
0
ответ дан Remy Lebeau 3 March 2019 в 10:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: