ファイルを圧縮して保存と呼び出し方法TZCompressionStream, TZDecompressionStream[JAPAN]

Posted by on in Programming

毛利です。

TZCompressionStreamを使って、TStreamデータを圧縮し保存し

さらにTZDecompressionStreamを使い解凍する方法をご紹介します。

まず圧縮と解凍用に共通のテンプレートクラスを作成します。

#include <fmx.h>
#include <System.ZLib.hpp>
#include <memory>
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
template <typename T1, typename T2, typename T3>
struct compression_stream
{
	///Template for common.
	std::unique_ptr<T1> f_compression_stream;
	T3 f_level;
	T2* f_stream;
	compression_stream(T3 l_level, T2* l_stream)
	{
		f_level     = l_level;
		f_stream 	= l_stream;
		f_compression_stream = {std::make_unique<T1>(l_level, f_stream)};
	}
	compression_stream(T2* l_stream)
	{
		f_stream 	= l_stream;
		f_compression_stream = {std::make_unique<T1>(f_stream)};
	}
	~compression_stream()
	{
	}
};

 

次にファイルをとって来て圧縮する用の関数を作成します。ファイルを呼び出す為にTFileStreamを使います。

///
void load_to_zipstream(String filename_in, String filename_out)
{
	///In this part you compress and save the entered data.
	std::unique_ptr<TFileStream> _in_stream{std::make_unique<TFileStream>(filename_in, fmOpenRead)};
	TFileStream* _out = new TFileStream(filename_out, fmCreate);
	try
	{
		compression_stream<TZCompressionStream, TFileStream, TCompressionLevel>
			_zip(TCompressionLevel::clDefault, _out);
		///After copying to TZCompressionStream, TFileStream data is compressed.
		_zip.f_compression_stream->CopyFrom(_in_stream.get(), _in_stream->Size);
	}
	__finally
	{
		delete _out;
	}
}

上のように、TFileStreamでファイルを取得しTZCompressionStreamCopyFrom()しています。

 


 

最後に、TZCompressionStreamで圧縮されたファイルをTFileStreamでまた呼び出して

TZDecompressionStreamで解凍しTMemoryStreamにコピーとTImageにBitmap->LoadFromStream()します。

//---------------------------------------------------------------------------
constexpr wchar_t input_filename[] = L"C:\\Embarcadero\\amane_pc.jpg";
constexpr wchar_t outp_filename[] = L"C:\\Embarcadero\\amane_pc.zip";
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	///Compress and save here.
	load_to_zipstream(input_filename,outp_filename);

	// *********************************************
	//    Read compressed file into TMemoryStream
	// *********************************************
	std::unique_ptr<TFileStream> _in{std::make_unique<TFileStream>(outp_filename, fmOpenRead)};
	std::unique_ptr<TMemoryStream> _memo{std::make_unique<TMemoryStream>()};


	compression_stream<TZDecompressionStream, TFileStream, TCompressionLevel > _uzip(_in.get());
	///Copy it to TMemoryStream here, it will be decompressed.
	_memo->CopyFrom(_uzip.f_compression_stream.get(), _uzip.f_compression_stream->Size);

	///Finally, it displays the Image1->Bitmap as a confirmation.
	Image1->Bitmap->LoadFromStream(_memo.get());

}
//---------------------------------------------------------------------------

圧縮されたファイルを呼び出してImage1に表示されました。

オリジナルのJPGファイルと比較すると少しだけ圧縮されていました。

JPGは基から圧縮されているのであまり効果はありません。

 


 

http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/ZLibCompressDecompress_(C++)

http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/ZLibCompressDecompress_(Delphi)

 



About
Gold User, No rank,
Delphi / C++Builder blogger

Comments

  • Page :
  • 1

Check out more tips and tricks in this development video: