PDA

View Full Version : حرفه ای: گرفتن سایز یک تصویر Jpg



ابوالفضل عباسی
دوشنبه 02 مرداد 1396, 13:00 عصر
باسلام.
چطور میتونم سایز(حجم)یک تصویر Jpg رو برحسب بایت بدست بیاورم؟

من نمی خوام از MemoryStream و FileStream استفاده کنم چون زمان برام خیلی مهمه.(دو روش ذکر شده خیلی کند میباشد.)

باتشکر.



راستی دوستان کسی نمی تونه جواب سوال قبلیم "ادغام کردن دو فیلم ویا تصویر (http://barnamenevis.org/showthread.php?540160-%D8%A7%D8%AF%D8%BA%D8%A7%D9%85-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D9%88-%D9%81%DB%8C%D9%84%D9%85-%D9%88%DB%8C%D8%A7-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1)" رو بده؟(یه راهنماییی !!)

mydelphi
سه شنبه 03 مرداد 1396, 07:39 صبح
فكر كنم اين تابع كار شما رو انجام بده


function FileSized(fileName : wideString) : Int64;
var
sr : TSearchRec;
begin
if FindFirst(fileName, faAnyFile, sr ) = 0 then
result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow)
else
result := -1;
FindClose(sr);
end;

ابوالفضل عباسی
سه شنبه 03 مرداد 1396, 08:48 صبح
دوست عزیز از پاسخت ممنونم.
من یه متغیر TImage دارم که تصویر jpg داخل اون هست،من میخوام حجم این TImage رو بدونم(اصلا این تصویر روی هارد ذخیره نشده است،اگر توی هارد ذخیره شده بود کلی روش برای بدست آوردن حجم بود.)
این تصویر از وبکم گرفته میشه و میخواهم به یک کامپیوتر دیگر ارسال کنم(با UDP) اما چون محدودیت حجم دارم،باید این تصویر رو به تکه های X بایتی تقسیم کنم.پس نیاز به حجم تصویر گرفته شده توسط وبکم دارم.(اما نمیشه که اول روی سیستم ذخیره کنم که حجمش رو بگیرم و بعد ارسال کنم!! زمان هدر میره)

لطفا راهنمایی کنید.

ابوالفضل عباسی
چهارشنبه 04 مرداد 1396, 08:14 صبح
تو رو به خدا کمکم کنید،بد جوری گیرم.:گریه::گریه::عصبانی++::عص بانی++::عصبانی:

Valadi
چهارشنبه 04 مرداد 1396, 21:32 عصر
از كامپونت Image EN استفاده كنيد

ابوالفضل عباسی
شنبه 07 مرداد 1396, 09:21 صبح
دوست عزیز من هم این به ذهنم رسید که از imageen استفاده کنم.
ولی:
1-پولیه
2-من خیلی مشتری دارم نمیتونم از demo استفاده کنم.
3-imageen هم دمو نداره.

Felony
شنبه 07 مرداد 1396, 10:50 صبح
اون تصویر قبل اینکه عکس باشه یه بافر هست ، بسته به کامپوننتی که برای ارتباط با وب کم استفاده کردی یا API خود ویندوز ، حتما کامپوننت مربوطه متدهایی ارائه میده که تصویر رو به صورت Stream ذخیره کنی ؛ حجم استریم میشه حجم تصویرت :)

Ananas
سه شنبه 14 شهریور 1396, 01:54 صبح
باسلام.
چطور میتونم سایز(حجم)یک تصویر Jpg رو برحسب بایت بدست بیاورم؟

من نمی خوام از MemoryStream و FileStream استفاده کنم چون زمان برام خیلی مهمه.(دو روش ذکر شده خیلی کند میباشد.)

باتشکر.



راستی دوستان کسی نمی تونه جواب سوال قبلیم "ادغام کردن دو فیلم ویا تصویر (http://barnamenevis.org/showthread.php?540160-%D8%A7%D8%AF%D8%BA%D8%A7%D9%85-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D9%88-%D9%81%DB%8C%D9%84%D9%85-%D9%88%DB%8C%D8%A7-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1)" رو بده؟(یه راهنماییی !!)

سلام. در مورد روش سیو کردن رو مموری بیشتر کند بودن بخاطر گرفتن فضا و حافظه هست. اگر بتونید رو فایلی که قبلا بوده سیو کنید یا مموری رو یک بار بگیرید و هر بار رو همون ذخیره کنید فکر میکنم سرعتش بیشتر بشه. چه روی رم چه روی هارد.
و اینکه بدون استفاده از ذخیره کردن بخاید سایزشو بگیرید فکر نمیکنم امکان داشته باشه...چون اطلاعات به شکل خام ذخیره نمیشن...پردازش میشن و حجم بعد از کار مشخص میشه. یعنی در واقع یک تصویر jpg وقتی با کلاس TJPEGImage لود میشه یا ساخته میشه اطلاعات به این شکل که روی هارد هستن داخل ساختارهای کلاس ذخیره نمیشن. چون باید بتونه روشون کار کنه و تغییر بده. و موقع ذخیره کردن به شکل فرمت فایل JPG در میاد. پس تا فایلو نساخته فکر نمیکنم بتونید حجمشو بگیرید.

Ananas
سه شنبه 14 شهریور 1396, 02:22 صبح
function getnow():Double;
var
lic, lif: Int64;
begin
QueryPerformanceCounter(lic);
QueryPerformanceFrequency(lif);
Result := lic / lif;
end;
//---------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
p: TJPEGImage;
ms: TMemoryStream;
t0, t1, t2: Double;
begin
p := TJPEGImage.Create();
p.LoadFromFile('D:\Avatar_8V1A9872_Edited.jpg');
p.CompressionQuality := 5;
Self.Canvas.Draw(0, 0, p);
p.Compress();
ms := TMemoryStream.Create();
//*************************************
//تو این قسمت میتونید حافظه رو رزرو کنید بیشتر از مقداری که لازم دارید برای اطمینان من 10 مگابایت گذاشتم.
//ms->SetSize(10 * 1024 * 1024);
//ms->Position = 0;
//*************************************
t0 := getnow();

p.SaveToStream(ms);

t1 := getnow();

ms.Position := 0;
p.SaveToStream(ms);

t2 := getnow();
ShowMessage(FloatToStr(t1 - t0) + ' sanie hamrah ba gereftane hafeze jadid'#13#10 +
FloatToStr(t2 - t1) + ' sanie bedone gereftane hafeze jadid'#13#10 +
FloatToStr((t1 - t0) / (t2 - t1)) + ' nesbate zamanha :)');


ms.Position := 0;
p.LoadFromStream(ms);
Self.Canvas.Draw(0, 500, p);
end;


این یک نمونه هست که دوبار سیو میکنه. بار اول حافظه ی جدید میگیره و بار دوم از همون حافظه استفاده میکنه برای ذخیره و در آخر زمان هر دو رو مقایسه میکنه. من یک تصویر 4 مگی رو امتحان کردم نتیجه از نظر زمانی 4 برابر شد!

ابوالفضل عباسی
چهارشنبه 22 شهریور 1396, 10:32 صبح
چون تصویری که از وبکم میگیرم توی حافظه است،این روش جواب نمیدهد.

ولی بابت پاسخت دوست عزیزم ممنون.