idhttp 다운로드 이미지를 확장에서 다른 이미지로 변환하는 방법은 무엇입니까?

Vlark. Lopin

웹에서 이미지 URL을 얻은 다음 메모리 스트림에 저장 한 다음 메모리 스트림에서 파일로 저장하는이 스레드가 있습니다.

다운로드 한 이미지를 gif 이미지로 변환해야하므로 이와 같은 작업을 수행했습니다.

unit downloadimgThread;

interface
uses Windows, SysUtils, Classes, dialogs, IdSSLOpenSSL, IdHttp, IdUri, System.AnsiStrings, Graphics, Jpeg, Vcl.Imaging.GIFImg, PNGImage;


type
  TDownloadUpdateVisualEvent = procedure(Sender: TObject; Anameofimg: String;
    var Aimagelocate: String) of object;

type
  TURLDownload = class(TThread)
  private
    FOnUpdateVisual: TDownloadUpdateVisualEvent;
    FURL: String;
    Fnameofimg: string;
    FPathImage: string;
    FFileNameImage: string;
    ImageName: string;
    PathURL: string;
    procedure DoUpdateVisual;
  protected
    procedure Execute; override;
  public
    constructor Create(Thrdid: Pointer; const AUrl: String;
      Const AOutPathImages: string; AOnUpdateVisual: TDownloadUpdateVisualEvent;
      Anameofimg: String); reintroduce;
    property URL: string read FURL write FURL;
    property PathImage: string read FPathImage;
    property FileNameImage: string read FFileNameImage;

  end;



var
URLDOWNLOAD: TURLDownload;

implementation

{ TURLDownload }



function JpgToGif(ms: TMemoryStream): Boolean;
var
  gif: TGIFImage;
  jpg: TJPEGImage;
begin
  Result := False;

  gif := TGIFImage.Create;
  try
    jpg := TJPEGImage.Create;
    try
      //jpg
      ms.Position := 0;
      jpg.LoadFromStream(ms);
      jpg.DIBNeeded;
      gif.Assign(jpg);

      //save...
      ms.Clear;
      gif.SaveToStream(ms);
      Result := True;
    finally
      jpg.Free;
      jpg := nil;
    end;
  finally
    gif.Free;
    gif := nil;
  end;
end;

constructor TURLDownload.Create(Thrdid: Pointer; const AUrl, AOutPathImages: string; AOnUpdateVisual: TDownloadUpdateVisualEvent; Anameofimg: String);
var
URI: TIdURI;
begin
inherited Create(false);
FreeOnTerminate := True;
FURL := AUrl;
FOnUpdateVisual := AOnUpdateVisual;
Fnameofimg := Anameofimg;
FPathImage := AOutPathImages;

URI := TIdURI.Create(AUrl);
try
ImageName := URI.Document;
PathURL := URI.path;
finally
URI.Free;
end;

end;

procedure TURLDownload.DoUpdateVisual;
begin
if Assigned(FOnUpdateVisual) then
FOnUpdateVisual(self, Fnameofimg, FFileNameImage);
end;

procedure TURLDownload.Execute;
var
aMs: TMemoryStream;
aIdHttp: TIdHttp;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
path: string;
dir: string;
SPEXT : String;
itsimage: string;
responsechk: Integer;
begin
dir := AnsiReplaceText(PathURL, '/', '');

if (ImageName = '') then
begin
exit;
end;

SPEXT := ExtractFileExt(ImageName);
ImageName := Copy(ImageName, 1, Length(ImageName) - Length(SPEXT));

path := PathImage + '\' + ImageName + '.gif';

if fileexists(path) then
begin
FFileNameImage := path;
if Assigned(FOnUpdateVisual) then
begin
Synchronize(DoUpdateVisual);
end;
exit;
end
else

if not fileexists(path) then
begin
aMs := TMemoryStream.Create;
aIdHttp := TIdHttp.Create(nil);
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try

IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.SSLOptions.Mode := sslmUnassigned;
aIdHttp.HTTPOptions := [hoForceEncodeParams] + [hoNoProtocolErrorException];
aIdHttp.IOHandler := IdSSL;
aIdHttp.AllowCookies := True;
aIdHttp.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
aIdHttp.HandleRedirects := True;
aIdHttp.RedirectMaximum := 3;
try
aIdHttp.Head(trim(FURL));
except
end;
itsimage := aIdHttp.Response.ContentType;
responsechk := aIdHttp.ResponseCode;

if responsechk <> 200 then
begin
FFileNameImage := 'error';

if Assigned(FOnUpdateVisual) then
begin
Synchronize(DoUpdateVisual);
end;
exit;
end;


if (itsimage = 'image/gif') then
begin
try
aIdHttp.Get(trim(FURL), aMs);
except
end;
aMs.SaveToFile(path);
end else if (itsimage = 'image/jpeg') then
begin
try
aIdHttp.Get(trim(FURL), aMs);
except
end;
if JpgToGif(aMs) then
begin
aMs.SaveToFile(path);
end;
end;


try
if aIdHttp.Connected then
aIdHttp.Disconnect;

except

end;


finally
aMs.Free;
IdSSL.Free;
aIdHttp.Free;
end;
end;

FFileNameImage := path;

if Assigned(FOnUpdateVisual) then
begin
Synchronize(DoUpdateVisual);
end;

end;

end.

이 단위에서 나는 이미지 유형이 jpg인지 확인한 다음 gif로 변환 하고이 코드 줄에 구체적으로 저장하려고합니다.

if (itsimage = 'image/jpeg') then
begin
try
aIdHttp.Get(trim(FURL), aMs);
except
end;
if JpgToGif(aMs) then
begin
aMs.SaveToFile(path);
end;
// function to convert 
function JpgToGif(ms: TMemoryStream): Boolean;
var
  gif: TGIFImage;
  jpg: TJPEGImage;
begin
  Result := False;

  gif := TGIFImage.Create;
  try
    jpg := TJPEGImage.Create;
    try
      //jpg
      ms.Position := 0;
      jpg.LoadFromStream(ms);
      jpg.DIBNeeded;
      gif.Assign(jpg);

      //save...
      ms.Clear;
      gif.SaveToStream(ms);
      Result := True;
    finally
      jpg.Free;
      jpg := nil;
    end;
  finally
    gif.Free;
    gif := nil;
  end;
end;

이미지를 변환하고 저장하려고 할 때 저장된 이미지가 손상되었습니다. 무엇이 문제 일 수 있습니까?

SilverWarior

이것에 대한 매우 간단한 해결책이 있습니다. 로드시 자동 형식 인식 및 메서드에 제공 한 파일 이름의 파일 확장자에 따라 저장시 자동 형식 선택을 허용하므로 FMX Bitmap기본값 대신 사용하는 것입니다 .VCL BitmapSaveToFile

다음은 선택한 이미지 OpenDialogMemory stream먼저 로드 한 다음으로 로드 Bitmap한 다음 이미지를 GIF 형식으로 저장 하는 간단한 코드입니다 .

procedure TForm1.Button1Click(Sender: TObject);
var Bitmap: FMX.Graphics.TBitmap;
    MS: TMemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    MS := TMemoryStream.Create;
    MS.LoadFromFile(OpenDialog1.FileName);
    Bitmap := FMX.Graphics.TBitmap.Create;
    Bitmap.LoadFromStream(MS);
    Bitmap.SaveToFile('D:\Proba.gif');
  end;
end;

보시다시피 몇 줄만 있으면 지원되는 모든 형식간에 이미지를 변환 할 수 있습니다.

지원되는 항목은 http://docwiki.embarcadero.com/Libraries/XE8/en/FMX.Graphics.TBitmapCodecManager#Supported_Image_Formats 에서 확인할 수 있습니다.

FMX.Graphics.TBitmap이있는 파일의 전체 네임 스페이스를 지정하여 실제로 FMX.Graphics.TBitmap을 사용하고 있는지 확인하십시오.

참고 : VCL 애플리케이션에서 작업한다고해서 Fire Monkey에있는 일부 기능을 사용할 수 없다는 의미는 아닙니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

새 Firebase 저장소에서 이미지를 다운로드하고 보는 방법은 무엇입니까?

분류에서Dev

6 분마다 웹 사이트에서 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

명확한 확장자가없는 사이트에서 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

s3에서 numpy 배열로 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

웹 사이트에서 모든 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

Flutter의 다운로드 디렉토리에 ByteData (이미지)를 저장하는 방법은 무엇입니까?

분류에서Dev

nscache를 사용하여 API에서 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

이미지를 바이트로 변환하고 다시 flutter에서 이미지로 변환하는 방법은 무엇입니까?

분류에서Dev

여러 URL에서 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

artsy.net에서 원본 크기 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

4chan에서 이미지와 webms를 다운로드하는 방법은 무엇입니까?

분류에서Dev

R에서 리디렉션 된 이미지 링크를 다운로드하는 방법은 무엇입니까?

분류에서Dev

firebase에 여러 이미지를 게시하고 다운로드 URL을 얻는 방법은 무엇입니까?

분류에서Dev

이미지를 강제로 다운로드하는 이미지에 대한 HTML 링크를 만드는 방법은 무엇입니까?

분류에서Dev

jQuery를 사용하여 한 이미지에서 다른 이미지로 전환 효과를 만드는 방법은 무엇입니까?

분류에서Dev

Python Azure Storage에서 Blob 이미지를 다운로드하고 여기에서 이미지 개체를 만드는 방법은 무엇입니까?

분류에서Dev

SVG에서 이미지 태그를 다른 태그로 변경하는 방법은 무엇입니까?

분류에서Dev

이미지를 Firebase 저장소에 업로드 한 다음 다운로드 URL을 반환하는 방법은 무엇입니까?

분류에서Dev

AngularJs : 다른 서비스에 이미지를 업로드하는 방법은 무엇입니까?

분류에서Dev

URL이 주어지면 이미지를로드 한 다음 Javascript에서 tf.tensor 데이터로 변환하는 방법은 무엇입니까?

분류에서Dev

fabricjs 캔버스 이미지를 다른 배경 이미지에 저장하는 방법은 무엇입니까?

분류에서Dev

이미지 크기를 변경하고 jquery로 다운로드하는 방법은 무엇입니까?

분류에서Dev

다른 이미지에 닿을 때 이미지를 애니메이션하는 방법은 무엇입니까?

분류에서Dev

openpyxl에서 한 Excel에서 다른 Excel로 이미지를 복사하는 방법은 무엇입니까?

분류에서Dev

다른 이미지 앞에 플레이어의 이미지를 만드는 방법은 무엇입니까?

분류에서Dev

iOS에서 imageView로 설정하기 위해 백그라운드에서 이미지를 다운로드하는 방법은 무엇입니까?

분류에서Dev

OpenCV에서 이미지를 부동 이미지로 변환하는 방법은 무엇입니까?

분류에서Dev

인라인 이미지를 Word에서 부동 이미지로 변환하는 방법은 무엇입니까?

분류에서Dev

2 개의 서로 다른 이미지 레이어를 병합하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    새 Firebase 저장소에서 이미지를 다운로드하고 보는 방법은 무엇입니까?

  2. 2

    6 분마다 웹 사이트에서 이미지를 다운로드하는 방법은 무엇입니까?

  3. 3

    명확한 확장자가없는 사이트에서 이미지를 다운로드하는 방법은 무엇입니까?

  4. 4

    s3에서 numpy 배열로 이미지를 다운로드하는 방법은 무엇입니까?

  5. 5

    웹 사이트에서 모든 이미지를 다운로드하는 방법은 무엇입니까?

  6. 6

    Flutter의 다운로드 디렉토리에 ByteData (이미지)를 저장하는 방법은 무엇입니까?

  7. 7

    nscache를 사용하여 API에서 이미지를 다운로드하는 방법은 무엇입니까?

  8. 8

    이미지를 바이트로 변환하고 다시 flutter에서 이미지로 변환하는 방법은 무엇입니까?

  9. 9

    여러 URL에서 이미지를 다운로드하는 방법은 무엇입니까?

  10. 10

    artsy.net에서 원본 크기 이미지를 다운로드하는 방법은 무엇입니까?

  11. 11

    4chan에서 이미지와 webms를 다운로드하는 방법은 무엇입니까?

  12. 12

    R에서 리디렉션 된 이미지 링크를 다운로드하는 방법은 무엇입니까?

  13. 13

    firebase에 여러 이미지를 게시하고 다운로드 URL을 얻는 방법은 무엇입니까?

  14. 14

    이미지를 강제로 다운로드하는 이미지에 대한 HTML 링크를 만드는 방법은 무엇입니까?

  15. 15

    jQuery를 사용하여 한 이미지에서 다른 이미지로 전환 효과를 만드는 방법은 무엇입니까?

  16. 16

    Python Azure Storage에서 Blob 이미지를 다운로드하고 여기에서 이미지 개체를 만드는 방법은 무엇입니까?

  17. 17

    SVG에서 이미지 태그를 다른 태그로 변경하는 방법은 무엇입니까?

  18. 18

    이미지를 Firebase 저장소에 업로드 한 다음 다운로드 URL을 반환하는 방법은 무엇입니까?

  19. 19

    AngularJs : 다른 서비스에 이미지를 업로드하는 방법은 무엇입니까?

  20. 20

    URL이 주어지면 이미지를로드 한 다음 Javascript에서 tf.tensor 데이터로 변환하는 방법은 무엇입니까?

  21. 21

    fabricjs 캔버스 이미지를 다른 배경 이미지에 저장하는 방법은 무엇입니까?

  22. 22

    이미지 크기를 변경하고 jquery로 다운로드하는 방법은 무엇입니까?

  23. 23

    다른 이미지에 닿을 때 이미지를 애니메이션하는 방법은 무엇입니까?

  24. 24

    openpyxl에서 한 Excel에서 다른 Excel로 이미지를 복사하는 방법은 무엇입니까?

  25. 25

    다른 이미지 앞에 플레이어의 이미지를 만드는 방법은 무엇입니까?

  26. 26

    iOS에서 imageView로 설정하기 위해 백그라운드에서 이미지를 다운로드하는 방법은 무엇입니까?

  27. 27

    OpenCV에서 이미지를 부동 이미지로 변환하는 방법은 무엇입니까?

  28. 28

    인라인 이미지를 Word에서 부동 이미지로 변환하는 방법은 무엇입니까?

  29. 29

    2 개의 서로 다른 이미지 레이어를 병합하는 방법은 무엇입니까?

뜨겁다태그

보관