ورود

View Full Version : حرفه ای: کوچک کردن فایل jpg در FileStream



masoode
سه شنبه 21 فروردین 1403, 17:07 عصر
سلام دوستان
در برنامه ای با استفاده از FileStream فایلی را باز میکنم و در دیتابیس ذخیره میکنم.
بعضی از فایلهای jpg بزرگ هستند و من میخواهم سایز کوچکتر ذخیره کنم:
var
sFile:TFileStream;
Ret:TThrMessageParam;
JPG:TJPEGImage;
BMP:TBitmap;
Scale:Real;
begin
sFile:=TFileStream.Create(FileName,fmOpenRead);
if IsThumb then begin
JPG:=TJPEGImage.Create;
JPG.LoadFromStream(sFile);
BMP:=TBitmap.Create;
if (JPG.Width>ThumbMaxWidth)or(JPG.Height>ThumbMaxHeight) then
if (JPG.Width/ThumbMaxWidth)>(JPG.Height/ThumbMaxHeight) then
Scale:=JPG.Width/ThumbMaxWidth
else
Scale:=JPG.Height/ThumbMaxHeight
else
Scale:=1;
BMP.Width:=Round(JPG.Width/Scale);
BMP.Height:=Round(JPG.Height/Scale);
Bmp.Canvas.StretchDraw(Rect(0,0,BMP.Width,BMP.Heig ht), JPG);
JPG.Assign(BMP);
JPG.SaveToFile('d:\aa.jpg');
JPG.SaveToStream(sFile);
BMP.Free;
JPG.Free;
end;
در این خط که به صورت آزمایشی نوشته ام، فایل کوچک شده به درستی ذخیره میشود
JPG.SaveToFile('d:\aa.jpg');
اما در خط بعد:
JPG.SaveToStream(sFile);
انتظار دارم محتویات فایل کوچک شده در sFile ذخیره شود که در ادامه برنامه در دیتابیس ذخیره شود. اما فایل اصلی در دیتابیس ذخیره میشود!!
لطفا راهنمایی کنید مشکل از کجاست؟

دلفــي
پنج شنبه 06 اردیبهشت 1403, 10:51 صبح
از TZCompressionStream و TZDecompressionStream استفاده کن


procedure TForm1.btnCompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LZip: TZCompressionStream;


begin
{ Create the Input, Output, and Compressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(Edit2.Text + '.zip', fmCreate);
LZip := TZCompressionStream.Create(clDefault, LOutput);


{ Compress data. }
LZip.CopyFrom(LInput, LInput.Size);


{ Free the streams. }
LZip.Free;
LInput.Free;
LOutput.Free;
end;


procedure TForm1.btnDecompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LUnZip: TZDecompressionStream;


begin
{ Create the Input, Output, and Decompressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(ChangeFileExt(Edit1.Text, 'txt'), fmCreate);
LUnZip := TZDecompressionStream.Create(LInput);


{ Decompress data. }
LOutput.CopyFrom(LUnZip, 0);


{ Free the streams. }
LUnZip.Free;
LInput.Free;
LOutput.Free;
end;

یوسف زالی
پنج شنبه 06 اردیبهشت 1403, 12:11 عصر
خود JPG دستور کمپرس هم دارد

khoshblagh
پنج شنبه 06 اردیبهشت 1403, 20:25 عصر
از TZCompressionStream و TZDecompressionStream استفاده کن


procedure TForm1.btnCompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LZip: TZCompressionStream;


begin
{ Create the Input, Output, and Compressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(Edit2.Text + '.zip', fmCreate);
LZip := TZCompressionStream.Create(clDefault, LOutput);


{ Compress data. }
LZip.CopyFrom(LInput, LInput.Size);


{ Free the streams. }
LZip.Free;
LInput.Free;
LOutput.Free;
end;


procedure TForm1.btnDecompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LUnZip: TZDecompressionStream;


begin
{ Create the Input, Output, and Decompressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(ChangeFileExt(Edit1.Text, 'txt'), fmCreate);
LUnZip := TZDecompressionStream.Create(LInput);


{ Decompress data. }
LOutput.CopyFrom(LUnZip, 0);


{ Free the streams. }
LUnZip.Free;
LInput.Free;
LOutput.Free;
end;


با سلام
155657

masoode
شنبه 08 اردیبهشت 1403, 11:49 صبح
از TZCompressionStream و TZDecompressionStream استفاده کن


procedure TForm1.btnCompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LZip: TZCompressionStream;


begin
{ Create the Input, Output, and Compressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(Edit2.Text + '.zip', fmCreate);
LZip := TZCompressionStream.Create(clDefault, LOutput);


{ Compress data. }
LZip.CopyFrom(LInput, LInput.Size);


{ Free the streams. }
LZip.Free;
LInput.Free;
LOutput.Free;
end;


procedure TForm1.btnDecompressClick(Sender: TObject);
var
LInput, LOutput: TFileStream;
LUnZip: TZDecompressionStream;


begin
{ Create the Input, Output, and Decompressed streams. }
LInput := TFileStream.Create(Edit1.Text, fmOpenRead);
LOutput := TFileStream.Create(ChangeFileExt(Edit1.Text, 'txt'), fmCreate);
LUnZip := TZDecompressionStream.Create(LInput);


{ Decompress data. }
LOutput.CopyFrom(LUnZip, 0);


{ Free the streams. }
LUnZip.Free;
LInput.Free;
LOutput.Free;
end;


مشکل من فشرده سازی نیست! من می خواهم عکس را کوچک کنم. در واقع میخواهم عکس ورودی با هر سایزی را حداکثر 90*60 کنم. تقریبا با کدی که نوشته ام انجام داده ام. اما با این کد اندازه فایل در استریم تغییر نمیکند! ولی وقتی با JPG.SaveToFile('d:\aa.jpg') ذخیره میکنم کوچک شده است!!!!

دلفــي
دوشنبه 10 اردیبهشت 1403, 15:18 عصر
مشکل من فشرده سازی نیست! من می خواهم عکس را کوچک کنم. در واقع میخواهم عکس ورودی با هر سایزی را حداکثر 90*60 کنم. تقریبا با کدی که نوشته ام انجام داده ام. اما با این کد اندازه فایل در استریم تغییر نمیکند! ولی وقتی با JPG.SaveToFile('d:\aa.jpg') ذخیره میکنم کوچک شده است!!!!


JPG.Assign(BMP);
JPG.CompressionQuality := 80;
JPG.Compress;

یوسف زالی
دوشنبه 10 اردیبهشت 1403, 18:05 عصر
مشکل من فشرده سازی نیست! من می خواهم عکس را کوچک کنم. در واقع میخواهم عکس ورودی با هر سایزی را حداکثر 90*60 کنم. تقریبا با کدی که نوشته ام انجام داده ام. اما با این کد اندازه فایل در استریم تغییر نمیکند! ولی وقتی با JPG.SaveToFile('d:\aa.jpg') ذخیره میکنم کوچک شده است!!!!
می تونید از توابعی مثل BitBlt استفاده کنید