الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استفسار عن حجم صورة

بدأه zxcqwe في 19 نوفمبر 2008 · 19 رد · 1,433 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أريد كود لمعرفة حجم الصورة قبل حفظها

بمعنى أننا نحفظ الصورة كالآتي:

Savepicture(picture,filename)0

فتأخذ حجماً على القرص الصلب

وما أريده هو معرفة الحجم الذي ستشغله على القرص

الصلب قبل أن أحفظها

/لغة البرمجة

Visual Basic 6

أرجو سرعة التلبية

...وشكراً

#2

أرجو الرد

#3

أين أنتم؟؟؟؟؟؟؟؟؟ :cry:

#4

الحل الأسهل انك تحفظها في مجلد الـ Temp الأول

واذا تقصد تتأكد من ان البارتيشن على آخره ولا لا .. هاندل الإيرور .. يعنى مثلا كده


On Error GoTo Err:

Call SavePicture(Me.Image, App.Path & "\1.bmp")

Exit Sub
Err:
MsgBox Err.Description
End Sub
Private Sub Test

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#5

ليس هذا ما أقصد أخي

أريد فقط أن أعرف الحجم الذي ستأخذه الصورة عند حفظها على القرص بدون أن أحفظها

#6

اخي الكريم استخدم الدالة filelen لارجاع حجم الملف بالبايت

وهذا مثال سريع لارجال حجم الملف بالكيلو بايت

 Dim FSize As Long

 FSize = FileLen("c:\fieName.exe")

 MsgBox "File size:" & Round((FSize / 1024), 1) & " kb"

fieName.exe = اسم ونوع الملف المطلوب . اي بمعنى انك تمرر مسار الملف واسمه واحصل على حجمة

ثم تقسم الناتج على 1024 لان كل واحد كيلو بايت يساوي هذا العدد .

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#7

السلام عليكم ورحمة الله وبركاته

أخي الكريم Omani/

هذا لمعرفة حجم ملف موجود على القرص الصلب ولكن كما قلت فأنا أريد معرفة الحجم الذي ستشغله الصورة على القرص بعد حفظها ولكن دون أن أحفظها.

يعني مثلاً عند حفظ الصورة يتم

1- قراءتها بواسطة السيستم.

2-وبالتالي تحديد حجم لها.

3- ثم اكسابها هذا الحجم.

فما أريده بالضبط أن يقوم برنامجي بنفس عمل السيستم أي يقرأ الصورة ويحدد الحجم الذي يجب أن تأخذه ولكن

دون تنفيذ الخطوة رقم (3) أي أنني لا أريد أن أحفظها إنما أريد فقط معرفة الحجم الذي ستكون عليه إذا تم حفظها

أرجو التفهم

وشكراً...

تم تعديل هذه المشاركة بواسطة zxcqwe في 22 نوفمبر 2008 في 13:35

#8

اولا الصورة من اين مصدرها ؟؟؟؟

في المثال السابق فقط اختر مصدر الصورة ..

هل تقصد الصورة في قاعدة البيانات ام ماذا ؟؟

فأنا لم افهم ماتريد بالضبط

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#9

فلنفترض ـ أخي ـ أنه هناك picture box وقد وضعت فيه صورة أياً كان مصدرها (لنقُل التقطنا صورة للشاشة ووضعناها في هذا الكائن) لذلك فليس لها مصدر أي أنها لا تملك path لأنها ليست موجودة على الجهاز أصلا وإلا لكنت عرفت حجمها كأي ملف عادي

وشكراً

#10

أرجو الرد

وشكراً...

#11

اخي الكريم : لابد من حفظ الصورة بشكل مؤقت لتعرف الحجم ومن ثم اعادة حذفها .

لحفظ الصورة بشكل مؤقت ومعرفة الحجم وحذفها مباشرة استخدم الكود التالي

dim Fl as integer

if dir(app.path & "\temp.jpg")<>"" then 
  kill app.path & "\temp.jpg"
end if

savepicture picture1.picture app.path & "\temp.jpg"

fl=filelen(app.path & "\temp.jpg")

kill app.path & "\temp.jpg"

msgbox "the file size is " & (fl/1024) & kb

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#12

نعم أخي كلامك صحيح وكنت أنوي فعل شئ من هذا القبيل إذا لم أجد مرادي

ولكن هل تعلم في برامج تصميم الصور المشهورة عندما تنتهي من التصميم وتأتي إلى حفظ الصورة يظهر لك حجم الصورة عند حفظها فهل يحفظها البرنامج في ال temp ثم يقوم بحذفها أم ماذا؟؟؟

هذا لأن برنامجي سيحتاج لمعرفة حجم عدد كبير جداً من الصور وفي وقت قصير لذلك أظن أن حفظ الصورة ثم حذفها هذا العدد من المرات سيؤثر على عمل البرنامج.

وشكراً أخي على المجهود...

تم تعديل هذه المشاركة بواسطة zxcqwe في 29 نوفمبر 2008 في 10:50

#13

يمكن حساب حجم الصورة بصفة تقريبية بالعلاقة

عمق ألوان الصورة محسوب بالـ Bits * ارتفاع الصورة محسوب بالـ Pixels * عرض الصورة محسوب بالـ Pixels

و كل هذه المعاملات يمكن معرفتها باستعمال الدالة GetObject و البنية BITMAP

أو باستعمال الخواص Height و Width للـ Picture(و ليس للـ PictureBox) و افتراض أن عمق الألوان هو 24 bits و لكن الحل الأول أحسن

#14

السلام عليكم أخي/

الطريقة الأولى لم أعرف كيفية استخدام GetObject ولكني استخدمت صورة موجودة على الجهاز أصلاً وقمت بضرب بعداها في 24(علماً بأن bit depthe لها يساوي 24 + امتدادها bmp) ولكن الناتج لم يكن مساوياً لحجمها .

فهل أخطأت فهمك أم ماذا؟؟؟

أرجو الإفادة

وشكراً...

#15

أخواني الكرام/

لأضيق نطاق البحث فسأخبركم بما أريد عمله بالضبط لكي يخبرني من يعرف طريقة أخرى غير الحجم

فلنفترض أنه توجد لديّ صورتان بنفس المواصفات التي تكلمت عنها(أي أنهما ليستا على الجهاز وإنما هما في البرنامج بأي طريقى كانت ـ مثلاً تم وضعهم عن طريق الحافظة "picture1.picture=clipboard.getdata" ـ ).

المطلوب: هو التفريق بين الصورتين

يعني مثلاً عندما يكون لديك نصان في 2textboxes فللتفرقة بينهم نكتب الآتي:

if text1.text=text2.text then

print 1

else

print 2

end if

ولكن عندما نريد معرفة هل الصورتان متطابقتان أم لا فماذا نفعل؟؟؟

ملحوظة : يمكن أن تكون الصورتان بنفس الأبعاد (Height,width) ولكنهما مختلفتان.

ملحوظة2 : الحل الآتي (أن يتم حفظ الصورتان والتحقق من حجمهما بالبايت ثم حذفهما ثانية) مرفوض وأي حل آخر به حفظ الصور ثم حذفهما مرفوض أيضاً وهذا لأنني سأستخدم هذا الأمر آلاف المرات في البرنامج فبالتالي لا يمكن أن أحفظ صوراً ثم أحذفها آلاف المرات.

أرجو ممن لديه فكرة لتنفيذ هذا الأمر أن يتكرم ويشارك بفكرته.

وشكراً..

#16

اخي الكريم : في هذه الحالة لا بد من تحويل القراءة الى Binary ومن ثم المقارنه بينهما . ولكنني لا استطيع افادتك اكثر والسبب في اني لم اتمكن للان من قراءة الصورة من داخل البكتشر بكس ... اما قراءتها من ملف فسهل جدا وتستطيع عمله باكثر من طريقة ...

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#17

السلام عليكم...

بالنسبة إلى الـ Bitmaps فإنه يمكن حساب حجمها كالتالي:

1. حساب حجم الصف بالبايت بالمعالدلة: حجم الصف = 4 × [ ( ( عمق البت × عرض الصورة ) + 31 ) / 32 ]

لأن عرض الصف يكون دائماً من مضاعفات الـ DWORD (أي Long في Visual Basic) و هو ما يساوي 4 بايت.

2. حجم الصورة = 54 + حجم الصف × ارتفاع الصورة.

العدد 54 هو عدد البايتات التي يشغلها رأس الصورة (BitmapHeader).

الكود التالي يقوم بهذه العملية على صورة من النوع Bmp في PictureBox

  1.  
  2. Option Explicit
  3.  
  4. Private Type BITMAP
  5. bmType As Long
  6. bmWidth As Long ' عرض الصورة
  7. bmHeight As Long ' ارتفاع الصورة
  8. bmWidthBytes As Long
  9. bmPlanes As Integer
  10. bmBitsPixel As Integer ' Bits per Pixel = Bit Depth عمق البت
  11. bmBits As Long
  12. End Type
  13.  
  14. Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal
    nCount As Long, lpObject As Any) As Long
  15.  
  16. Dim PicInfo As BITMAP
  17. Dim RowSize As Long
  18. Dim FileSize As Long
  19.  
  20. Private Sub Command1_Click()
  21. GetObject Picture1.Picture, Len(PicInfo), PicInfo
  22. RowSize = 4 * Int(((PicInfo.bmBitsPixel * PicInfo.bmWidth) + 31) / 32)
  23. FileSize = 54 + RowSize * PicInfo.bmHeight
  24.  
  25. MsgBox "حجم الصورة = " & CStr(FileSize)
  26. End Sub
  27.  

كما في الصورة التالية:

post-28631-1228213336_thumb.jpg

أما بالنسبة لمقارنة الصور فإن لي مشاركة حول هذا الموضوع منذ عدة أشهر. إذا وجدتها فسأخبرك بها إن شاء الله تعالى.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#18

تعقيب

السلام عليكم...

فقط تعقيب على المشاركة السابقة: يمكن حساب حجم الـ Bitmap دون الحاجة إلى حساب حجم الصف لأن حجم الصف بالبايت موجود ضمن الـ BITMAP type كالتالي:

  1. Option Explicit
  2.  
  3. Private Type BITMAP
  4. bmType As Long
  5. bmWidth As Long
  6. bmHeight As Long
  7. bmWidthBytes As Long ' حجم الصف بالبايت
  8. bmPlanes As Integer
  9. bmBitsPixel As Integer ' Bits per Pixel = Bit Depth
  10. bmBits As Long
  11. End Type
  12.  
  13. Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal
    nCount As Long, lpObject As Any) As Long
  14.  
  15. Dim PicInfo As BITMAP
  16. Dim FileSize As Long
  17.  
  18. Private Sub Command1_Click()
  19. GetObject Picture1.Picture, Len(PicInfo), PicInfo
  20. FileSize = 54 + PicInfo.bmWidthBytes * PicInfo.bmHeight
  21.  
  22. MsgBox "حجم الصورة = " & CStr(FileSize)
  23. End Sub
  24.  

و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#19

السلام عليكم...

بالنسبة إلى مقارنة صورتين...

ضع على الـ Form مكونين إضافيين من الـ PictureBox (مثلاً Picture1 و Picture2) و اضبط الخاصية Visible لكليهما على False ثم استعمل الكود التالي:

  1. ' دالة لمقارنة صورتين
  2. Private Function Are2PicsEqual(APicture1 As StdPicture, APicture2 As StdPicture) As Boolean
  3. Dim Y As Long
  4. Dim X As Long
  5. Dim Pxl1 As Long
  6. Dim Pxl2 As Long
  7.  
  8. Picture1.ScaleMode = vbPixels
  9. Picture2.ScaleMode = vbPixels
  10. Picture1.AutoSize = True
  11. Picture2.AutoSize = True
  12. Picture1.AutoRedraw = True
  13. Picture2.AutoRedraw = True
  14. Picture1.Cls
  15. Picture2.Cls
  16.  
  17. Set Picture1.Picture = APicture1
  18. Set Picture2.Picture = APicture2
  19.  
  20. Are2PicsEqual = False
  21. For Y = 0 To Picture1.ScaleHeight - 1
  22. For X = 0 To Picture1.ScaleWidth - 1
  23. Pxl1 = Picture1.Point(X, Y)
  24. Pxl2 = Picture2.Point(X, Y)
  25. If Pxl1 <> Pxl2 Then Exit Function
  26. DoEvents
  27. Next X
  28. Next Y
  29. Are2PicsEqual = True
  30. End Function
  31.  

ثم استعمل الدالة كالتالي:

  1. Private Sub Command4_Click()
  2. If Are2PicsEqual(Image1.Picture, Image2.Picture) Then
  3. MsgBox "Pictures Equal"
  4. Else
  5. MsgBox "Pictures Different"
  6. End If
  7. End Sub
  8.  

الدالة Are2PicsEqual تعمل مقارنة على أساس بكسل مقابل بكسل. قد تعيد نتيجة سريعة و قد تتأخر. لاحظ أنها تتوقف عن المقارنة بمجرد وجود اختلاف بين الصورتين.

الدالة التالية فقط زيادة من عندي و هي للتأكد ما إذا كانت الصورة فارغة أم لا:

  1.  
  2. Public Function IsEmptyPicture(APicture As StdPicture) As Boolean
  3. IsEmptyPicture = IIf(APicture.Handle = 0, True, False)
  4. End Function
  5.  

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#20

بارك الله فيك أخي الكريم على المجهود فقد استفدت فائدة عظيمة

وقد أرسلت لك رسالة بخصوص طلب آخر فهل وصلتك؟؟؟

مواضيع مشابهة