PDA

View Full Version : مشکل در بازیابی فیلد Image



MozenAbasi
جمعه 12 اسفند 1390, 14:04 عصر
سلام به همه شما خوبان
من تو برنامم یک تصویر با فرمت bitmap دارم که با دستور :

SpImageUpdate.Parameters.ParamByName('@Shape' ).Assign(Image1.Picture) ;
تو دیتابیس ذخیره می کنم ولی وقتی با دستور :

Image2.Picture.Assign(ADOQuery1Shape);
می خوام بازیابیش کنم با پیغام زیر مواجه میشم .
83578

ممنون می شم کمکم کنید

tiphooo
جمعه 12 اسفند 1390, 16:13 عصر
دوست عزیز نوع فیلدی که در دیتابیس در نظر گرفته اید از چه نوع است
ظاهرا نحوه ذخیره شما مشکل دارد نه بازیابی یعنی اصلا تصویری ذخیره نشده
نوع فیلد را مشخص کنید تا در مورد نحوه ذخیره و بازیابی برایتان توضیح دهم هر چند اگر در سایت جستجو کنید به احتمال زیاد قبلا به این موضوع پرداخته شده

MozenAbasi
جمعه 12 اسفند 1390, 17:01 عصر
نوع فیلد در جدول از نوع Image هستش
تاکید می کنم که عکسی باید ذخیره شود از نوع BitMap می باشد

tiphooo
جمعه 12 اسفند 1390, 18:29 عصر
برای ذخیره به صورت زیر عمل کنید
var
Jpg: TJPEGImage;
BlobStream: TMemoryStream;
bmp: TBitmap;
begin
BlobStream := TMemoryStream.Create;
bmp := TBitmap.Create;
Jpg := TJPEGImage.Create;
try
bmp.Assign(pPicture.Bitmap);
Jpg.Assign(bmp);
Jpg.Compress;
Jpg.SaveToStream(BlobStream);
BlobStream.Position := 0;
TBlobField(pBlobField).LoadFromStream(BlobStream);
finally
Jpg.Free;
bmp.Free;
end;

end;
pPicture همان Image شماست وpBlobField نام فیلدی که قرار است در آن ذخیره سازی انجام شود
و برای نمایش تصویر
var
BlobStream: TMemoryStream;
jpg: TJPEGImage;
begin

if not pBlobField.IsNull then
begin
BlobStream := TMemoryStream.Create;
jpg := TJPEGImage.Create;
try
TBlobField(pBlobField).SaveToStream(BlobStream);
BlobStream.Position := 0;
jpg.LoadFromStream(BlobStream);
pPicture.Bitmap.Assign(jpg);
finally
jpg.Free;
BlobStream.Free;
end;
end
else
begin
pPicture.Bitmap.Assign(nil);
end;
در اینجا pPicture مجددا همان Image شماست وpBlobField نام فیلد

این نمونه کد تصاویر را به صورت JPG ذخیره می کند تا حجم کمتری در DB اشغال کند ولی تصویر ورودی شما می تواند bmp هم باشد

unit های Graphics, jpeg را به برنامه اضافه کنید

MozenAbasi
جمعه 12 اسفند 1390, 21:07 عصر
خیلی ممنون از پیگیری شما دوست بزرگوارولی حین درج با پیغام زیر مواجه میشم :
Access violation at address 004739B6 in module 'project1.exe' , Read of Address 00000006 .
برای اینکه بیش از این وقت شما رو نگیرم تقاضا دارم به کدهام که توی یه پروژه کوچیک که با دلفی 7 نوشتم براتون نوشتم توجه کنید و بفرمایید ایراد کار کجاست . در ضمن فیلد pBlobField فیلد پروسیژر درجمه ؟؟ یا یه Image هستش که بعدن به پارامتر پروسیژر درجم نسبت می دم ؟

ممنون
http://www.4shared.com/zip/R0e79KS9/Formoul_Nevisi.html?

tiphooo
جمعه 12 اسفند 1390, 21:38 عصر
دوست عزیز این تصویر برنامه شماست.
مشکل کار کجاست؟
در image2 که تصویر را نشان می دهد الان مشکل چیست؟

MozenAbasi
جمعه 12 اسفند 1390, 23:41 عصر
شما هیچ کدی رو تغییر ندادید ؟ چون همونطور که گفتم خطای بالا رو میده !
لطفا اگه کدی تغییر کرده آپلود کنید

tiphooo
شنبه 13 اسفند 1390, 13:20 عصر
خیر من هیچ چیزی رو تغییر ندادم. همونطوری که کد رو گرفتم کامپایل کردم
شاید خطای شما Exceptions می باشد
Stop In Delphi Exceptions را غیر فعال کنید.

MozenAbasi
شنبه 13 اسفند 1390, 13:41 عصر
از کجا غیر فعالش کنم ؟ چیزی پیدا نکردم

tiphooo
شنبه 13 اسفند 1390, 20:51 عصر
در منور Tools/Debugger Option/Language Exceptions تیک گزینهStop On Delphi Exceptions در گوشه سمت چپ صفحه رو بردارید

laaleh
پنج شنبه 11 اردیبهشت 1393, 14:43 عصر
سلام. ممنون از مطلب خوبی که زحمت کشیدید و نوشتید. من هم یه سوال دارم. :لبخندساده:من عکسهام رو تو بانک داده ذخیره نکردم و فقط مسیر ذخیره خود عکسها در هارد رو تو یه فیلد از نوع ntext نگهداری کردم. و برای بازیابی از این مسیر استفاده میکنم. حالا میخوام از این عکسها چاپ بگیرم توی فست ریپورت. این امکان وجود داره؟ و یه سوال دیگه هم اینکه آیا اگر انواع مختلفی از عکس قرار باشه ذخیره بشه یعنی محدودیتی نگذاشته باشیم که حتما jpg باشه یا bmp مشکلی پیش میاد؟ اگر ممکنه من و راهنمایی بفرمایید. ممنون میشم

laaleh
شنبه 13 اردیبهشت 1393, 22:00 عصر
با سلام
ابتدا اینکه کنترل Picture در FastReport محدودیتی از بابت استفاده از فرمت فایل تصویر نداشته و Bmp,Jpg و چند فرمت دیگر را ساپورت میکند...
در بخش اول سوال یعنی دسترسی به تصویر توسط ادرس ان در حافظه و نمایش ان در FastReport شاید ساده ترین راه استفاده از کد نویسی در FastReport است ... برای این کار یک کنترل (Component ) تصویر (Picture) در صفحه بگذارید در قسمت رویدادها (Events) این شی روی رویداد OnBeforPrint دو بار کلیک کنید تا صفحه کد مربوطه بیاید در قسمت کد دستور زیر را بنویسید Picture1.Picture.LoadFromFile(در این قسمت مسیر فایل را بنویسید);
اگر فرض کنیم ادرس فایل شما در یک Query با نام Q1 و نام فیلد FilePath تعریف شده باشد دستور آن به شکل زیر است
Picture1.Picture.LoadFromFile(<Q1."FilePath">)
دقت داشته باشید اگر مسیر فایلها درست نباشد با خطا مواجه می شوید
بنابراین از صحت مسیر فایلها مطمئن شوید و اگر رکوردی تصویر ندارد با شرط Null آن را چک کنید یعنی در صورتی که مسیر فایل Null نبود دستور فوق اجرا شود.
با توجه به عدم اشنایی بنده با سطح دانش شما سعی شد ساده توضیح داده شود ....
موفق باشید

یوسف زالی
شنبه 13 اردیبهشت 1393, 22:19 عصر
با سلام.
صفرم، ورود و شروع به کار شما رو بهتون تبریک می گم.
اول اینکه سوال شما بهتر بود در بخش گزارش گیری مطرح می شد نه عمومی.
در ثانی، لازم می دونم تشکر کنم بابت این که جواب مطالب مورد سوالتون رو در اختیار دیگران هم قرار دادید.
امیدوارم دوستان یه تکونی به خودشون بدند..