PDA

View Full Version : استخراج فایل تصاویر از بانک اطلاعاتی



iman_Delphi
سه شنبه 03 آبان 1390, 10:07 صبح
با سلام

من از دلفی 2010 وبانک اطلاعاتی2003 access استفاده می کنم
من فیلدی از نوع باینری دارم که داخلش توسط کاربر عکس ذخیره شده است. احتمالا" با پسوند bmp - متائسفانه دسترسی به کاربر ندارم.

با TField.LoadFromStream- TMemoryStream - Tstream - Tjpag - bitmap - TField.savetoFile و غیره قبلا کار کرده ام و آشنایی لازم رو دارم حتی برای تست ; خودم چند موردی رو دستی تست کرده ام - تغریبا" مطابق مباحثی که قبلا" در سایت برنامه نویس ذکر شده کار کرده ام.

و اما مشکل : زمانی که من فایل عکس رو از دیتابیس با هر روشی بازگردانی می کنم مطابق موارد ذکر شده بالا; زمانی که با نوتپد باز می کنم میبینم که ساختار متعارفی نداره و تغریبا" فایل دارای ساختار نوع دیگری است.
جهت اطلاع : کاربر زمانی که عکس در پایگاه قرار می دهد آن را کد نمیکند (base64-md5,sh1,.....)

راهنمایی : زمانی که با نوتپد باز میکنم داخل آن حروف
ےےےےےےےPhoto Editor Photo MSPhotoEd.3 MSPhotoEd.3 ¾ ذدà،± ےےےےےےےےےے
در بین دنباله بیکران ےےےےےüےےےےےےےےےےےےےےےےےےے ےےےےےےے قرار دارد. خودم به این دنباله های باینری آشنایی دارم و شک دارم که BMP است اما خط اول فایل رو در موارد bmp مشاهده نکرده ام. آیا زمانی که از access بازگردانی می کنم باید از کلاس خاصی استفاده کنم؟

ممنون میشم اگه کمک کنید

یوسف زالی
سه شنبه 03 آبان 1390, 14:41 عصر
سلام.
اون کاراکتر کد 255 معادل رنگ سفید هست.
احتمالا یک عکس که اکثر جاهاش سفیده وجود داره.
ممکنه تمام عکس سفید باشه.

iman_Delphi
چهارشنبه 04 آبان 1390, 09:51 صبح
درسته - سفید هست اما مشکل من اینه که چه طوری میشه استخراج کرد اون عکس رو; چون با هیچ برنامه ای باز نمیشه

و اینکه تا جایی که بررسی کردم این نوع عکس به صورت OLE هست که در اکسس embeded شده.

یوسف زالی
چهارشنبه 04 آبان 1390, 11:02 صبح
دوست من با کدی که نوشتم امتحان کنید:

procedure LoadPictureFromField(ADOContainer: TCustomADODataSet; BlobField: TBlobField; Img: TImage);
var
Stream:TStream;
JPG: TJPEGImage;
JPG_Error: boolean;
begin
Stream := TStream.Create;
JPG := TJPEGImage.Create;
Stream := ADOContainer.CreateBlobStream(BlobField,bmRead);
if Stream.Size = 0 then
begin
Img.Picture.Assign(nil);
exit;
end;
JPG_Error := false;
try
JPG.LoadFromStream(Stream);
except
JPG_Error := true;
end;
if not JPG_Error then
begin
Stream.Destroy;
Img.Picture.Assign(JPG);
JPG.Destroy;
end
else
begin
Stream.Destroy;
JPG.Destroy;
Img.Picture.Assign(BlobField); // when old type exists in DB started by 0x424D
end;
end;



در فراخوانی:
LoadPictureFromField(YourADOTABLE, YourADOTABLEBlobField, Image1) // test

iman_Delphi
چهارشنبه 04 آبان 1390, 11:28 صبح
فدات شم این جواب نمیده چون اون عکسی که من دارم اصلا" از ole رد شده اومده توی ADO من .
اینی که شما گذاشتین مربوط به فراخوانی یک عکس که به صورت استاندارد در جدول قرار گرفته اما اونی که من دارم اصلا" فایلی نیست که توی کلاس Tjpeg , Tbitmap و اینا باشه.


راهنمایی : زمانی که با نوتپد باز میکنم داخل آن حروف
ےےےےےےےPhoto Editor Photo MSPhotoEd.3 MSPhotoEd.3 ¾ ذدà،± ےےےےےےےےےے

یوسف زالی
چهارشنبه 04 آبان 1390, 12:41 عصر
آقا یک سلکتی بزن ببین چی میده اولش؟
مثلا 0XFFD8FFFF
یا اگه باز اجق وجق داد کدهای اولش رو به فرم کد کاراکتری بگو

iman_Delphi
چهارشنبه 04 آبان 1390, 13:41 عصر
متشکرم از پیگیریت.
این فایل رو با نوت پد باز کنید.
محتوای داخلش رو مشاهده نمائید.

ehstrn2010
پنج شنبه 24 آذر 1390, 01:31 صبح
اکسس هنگام ذخیره عکس کلا ole object آدرسشم ذخیره می کنه => یه استاندارد نداره تو این فایل توضیحات لازم رو داده Delphi - Using ADO from Delphi.pdf که باید از تورنت توی بسته Delphi eBooks دانلودش کنی 1.5 مگا بایت

vcldeveloper
پنج شنبه 24 آذر 1390, 10:19 صبح
من فیلدی از نوع باینری دارم که داخلش توسط کاربر عکس ذخیره شده است. احتمالا" با پسوند bmp - متائسفانه دسترسی به کاربر ندارم.

مشکل شما دریافت عکس از بانک اطلاعاتی نیست؛ مشکل شما اینه که نمیدونید چه داده ایی با چه فرمتی در اون فیلد ذخیره شده. خب وقتی داده مربوطه Bitmap یا هر یک از سایر فرمت های رایج تصویری نیست، کلاس های مربوطه که نمی تونند معجزه کنند.

با فرض اینکه داده مورد نظر شما به صورت OLE Object ذخیره شده باشه، اون رو در یک Stream یا یک فایل ذخیره کنید، و محتوای اون رو به کنترل OleContainer دلفی بدید، ببینید اون کنترل این داده رو با چه برنامه ایی باز میکنه. اگر باز کرد، یعنی پیش فرض OLE Object درست هست، و اون داده تصویر نیست.