PDA

View Full Version : سوال: با چه تابعی حجم عکس روموقع سیوکردنش تو پایگاه داده کنترل کنیم



tik_tak
پنج شنبه 30 آبان 1387, 09:58 صبح
درموقع سیو کردن یک عکس در پایگاه داده اس کیو ال چه طوری میشه که حجم عکس را بتوان کنترل کرد مثلا اگر موقع سیو کردن عکس حجم مطلوب رو 50 کیلو گرفتیم اگه عکسی که بیشتر از 50 کبلو باشد براش یه پیغام بیاد و اجازه سیو نده
در ضمن نوع داده SQL را Image
و در برنامهم به روش Blob ذخيره وبازيابي میکنم




procedure TForm1.Save;
var
stream:tstream;
begin
with ADOQuery1 do
begin
sql.Text:='select * from picsample';
Open;
end;
stream:=ADOQuery1.CreateBlobStream(ADOQuery1.Field ByName('pic'),bmRead);
image1.Picture.Graphic.SaveToStream(stream);
With ADOQuery1 do
begin
SQL.Text:='insert into picsample (name,family,pic) VALUES (:p0,:p1,:p2)';
Parameters.ParamByName('p0').Value:=edit1.Text;
Parameters.ParamByName('p1').Value:=edit2.Text;
Parameters.ParamByName('p2').LoadFromStream(stream ,ftBlob);
ExecSQL;
end;
end;

vcldeveloper
پنج شنبه 30 آبان 1387, 16:21 عصر
stream یک خصوصیت size داره که حجم آن را بر میگردانه.

tik_tak
پنج شنبه 30 آبان 1387, 22:23 عصر
میشه بیشتر توضیح بدین
ممنون میشم
من تو سایت سرچ کردم این کد و نوشته بودن این همونه که شما گفتین :


var
Mems:TMemoryStream;
begin
Mems:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Mems);
Mems.Position:=0;
showmessage(inttostr(Mems.Size));
Mems.Free;

end;

shervin farzin
پنج شنبه 30 آبان 1387, 23:42 عصر
سلام

يه راه پيشنهادي ميتونه اين باشه كه حجم عكس رو قبل از تبديل شدنش به Stream بدست
بيارين . يعني همون موقعي كه كاربر از روي سيستمش فايل عكس رو انتخاب ميكنه ، تست
كنين كه اگه از 50 k بيشتره بهش پيغام مناسب بده و اصلا كار به تبديل عكس به Stream نرسه
براي اين كار ميتونين از تابع زير استفاده كنين .


function TForm1.FindSize(Fileaddr: string): String;
var
x:TSearchRec;
fsize:string;
i,y:integer;
z:Real;
begin
FindFirst(Fileaddr,faanyfile,x);
fsize:=inttostr(x.Size);
y:=0;
z:=strtofloat(fsize);
while(z>=1000) do
begin
z:=z/1000;
y:=y+1;
end;
i:=length(floattostr(z));
while copy(floattostr(z),i,1)<>'.' do i:=i-1;
case y of
0:result:=copy(floattostr(z),1,i+2)+' Byte';
1:result:=copy(floattostr(z),1,i+2)+' KB';
2:result:=copy(floattostr(z),1,i+2)+' MB';
end;
end;


فراخواني اين تابع هم ميتونه به اين شكل باشه :

Label1.caption := findsize ( 'C:\mypic.jpg' )

البته من اين تابع رو زماني نوشته بودم كه ميخواستم سايز فايل هر رو هرچي كه هست نمايش
بدم ولي شايد شما لازم باشه يه چند خطي رو ازش پاك كنين تا بشه هموني كه ميخواستين .
موفق باشيد .

vcldeveloper
جمعه 01 آذر 1387, 09:22 صبح
میشه بیشتر توضیح بدین
ممنون میشم
من تو سایت سرچ کردم این کد و نوشته بودن این همونه که شما گفتین
در همون کد اگر مثلا می نوشتید PicSize := Mems.Size، اندازه stream (که مساوی اندازه داده ایی است که در آن قرار داره؛ یعنی مساوی اندازه عکس) بدست میامد.

tik_tak
جمعه 01 آذر 1387, 21:59 عصر
من بااین دستور عکس رو در ایمیج قرار میدم:


if OpenDialog1.Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);

میخوام وقتی عکس بیشتراز 100 کیلو بود این ایمیج پاک بشه منظورم اینه که انگار نه انگار که کاربر عکس انتخاب کرده درواقع حالتی رو نشون بده که کاربر عکس انتخاب نکرده یعنی تهی بشه ،نال بشه

vcldeveloper
شنبه 02 آذر 1387, 01:16 صبح
میخوام وقتی عکس بیشتراز 100 کیلو بود این ایمیج پاک بشه منظورم اینه که انگار نه انگار که کاربر عکس انتخاب کرده درواقع حالتی رو نشون بده که کاربر عکس انتخاب نکرده یعنی تهی بشه ،نال بشه

Image1.Picture.Assign(nil);

_alish_
شنبه 02 آذر 1387, 12:50 عصر
function GetFileSize(const S: string): Int64;
var
FD: TWin32FindData;
FH: THandle;
begin
FH := FindFirstFile(PChar(S), FD);
if FH = INVALID_HANDLE_VALUE then Result := 0
else
try
Result := FD.nFileSizeHigh;
Result := Result shl 32;
Result := Result + FD.nFileSizeLow;
finally
CloseHandle(FH);
end;
end;

if OpenDialog1.Execute then
if GetFileSize(OpenDialog1.FileName)<500 then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);

vcldeveloper
شنبه 02 آذر 1387, 14:13 عصر
برای بدست آوردن حجم فایل لازم نیست اینقدر کد بنویسید، خود ویندوز تابع GetCompressedFileSize را داره که نام فایل را میگیره، و اندازه آن را بر می گردونه.