سلام.
در تاپیک های این بخش به صورت جزئی و اشاره ای به ارسال پیام تصویری پرداخته شده بود و من گفتم بهتره در یک تاپیک مجزا و مخصوص این بحث رو مطرح کنیم و به نتیجه برسونیم و در نهایت هم یک مثال با پیاده سازی قرار بدیم تا سایر دوستان هم استفاده کنند.

خوب، من هم در این سایت و هم توی اینترنت خیلی جستجو کردم ، ولی به نتیجه کامل نرسیدم. چیزهایی که فهمیدم ایناست :
1- عکس باید به صورت Bitmap سیاه و سفید باشه با سایز 14*72 یا 28*72
2-باید به صورت یک رشته هگز کدهای Bitmap رو پشت سر هم قرار بدیم که احتمالا فایل OTA هم همینه، یعنی از پیکسل 0و0 (بالا سمت چپ) به صورت سطری تا آخرین پیکسل پایین سمت راست Bitmap رو بخونیم ، اگر رنگش سفید بود 0 و اگر رنگ دیگه ای بود 1 قرار بدیم.
3- در یک سایت دیدم که باید DataCodingScheme = F7 باشه.
4- UserDataHeader هم باید تنظیم بشه. ( نمیدونم چیه.)
5- جناب Noorsoft در تاپیک PDU Encoding/Decoding یک لینک از سایتشون قرار دادن که یک برنامه هست که فایل Bitmap رو میگیره و به OTA تبدیل میکنه.

در ضمن، یک برنامه از سایت CodeProject گرفتم به زبان #C که به VB.Net 2005 تبدیلش کردم، برای تبدیل Bitmap به OTA :


Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Drawing
Imports System.Windows.Forms
Namespace OTAViewer
PublicClass OTAFile
PublicConst WIDTH AsInteger = 72
PublicConst HEIGHT AsInteger = 28
PrivateConst DATASIZE AsInteger = WIDTH / 8 * HEIGHT
Private m_Bitmap AsByte(,) = NewByte(WIDTH / 8 - 1, HEIGHT - 1) {}
PrivateSubNew()
EndSub
''' <summary>
''' Represents a (71, 27) Bitmap.
''' </summary>
''' <param name="x">X</param>
''' <param name="y">Y</param>
''' <returns>True if Pixel is set.</returns>
DefaultPublicProperty Item(ByVal x AsInteger, ByVal y AsInteger) AsBoolean
Get
Dim b AsByte = m_Bitmap(x / 8, y)
Dim bit AsByte = CByte((7 - x Mod 8))
Dim t AsByte = CByte(Math.Pow(2, bit))
Return (b And t) = 0
EndGet
Set(ByVal value AsBoolean)
Dim xx AsInteger = x / 8
Dim bit AsByte = CByte((7 - x Mod 8))
Dim t AsByte = CByte((1 << bit))
Dim i AsByte = CByte((Byte.MaxValue - t))
If value Then
m_Bitmap(xx, y) = m_Bitmap(xx, y) Or t
Else
m_Bitmap(xx, y) = m_Bitmap(xx, y) And i
EndIf
EndSet
EndProperty
PublicFunction ToBitmap() As Bitmap
Dim bmp AsNew Bitmap(72, HEIGHT)
For i AsInteger = 0 To 71
For j AsInteger = 0 To HEIGHT - 1
IfMe(i, j) Then
bmp.SetPixel(i, j, Color.White)
Else
bmp.SetPixel(i, j, Color.Black)
EndIf
Next
Next
Return bmp
EndFunction
PublicReadOnlyProperty Data() AsByte()
Get
Dim s AsByte() = NewByte(DATASIZE + 3) {}
s(0) = 0
s(1) = 72
s(2) = HEIGHT
s(3) = 1
Dim k AsInteger = 4
For j AsInteger = 0 To HEIGHT - 1
For i AsInteger = 0 To 8
s(System.Math.Max(System.Threading.Interlocked.Inc rement(k), k - 1)) = m_Bitmap(i, j)
Next
Next
Return s
EndGet
EndProperty
PublicSharedFunction FromBitmap(ByVal img As Image) As OTAFile
If img.Width <> 72 OrElse img.Height <> HEIGHT OrElse img.PixelFormat <> System.Drawing.Imaging.PixelFormat.Format1bppIndex ed Then
ThrowNew Exception(String.Format("A " + "72x{0} Pixel Black-and-White image Required.", HEIGHT))
EndIf
Dim bmp AsNew Bitmap(img)
Dim ota AsNew OTAFile()
For i AsInteger = 0 To 71
For j AsInteger = 0 To HEIGHT - 1
ota(i, j) = (bmp.GetPixel(i, j) <> Color.FromArgb(255, 255, 255))
Next
Next
Return ota
EndFunction
PublicSharedFunction FromFile(ByVal file__1 AsString) As OTAFile
Dim ota AsNew OTAFile()
Dim buf AsByte() = NewByte(DATASIZE - 1) {}
Dim fs As Stream = File.OpenRead(file__1)
fs.Position = 4
fs.Read(buf, 0, DATASIZE)
fs.Close()
Dim x AsInteger
Dim y AsInteger
For i AsInteger = 0 To DATASIZE - 1
x = i
Mod 9
y = i / 9
ota.m_Bitmap(x, y) = buf(i)
Next
Return ota
EndFunction
EndClass
End
Namespace



حالا، دوستان لطف کنند با ارائه توضیحات یا معرفی لینک ها و ارائه مثال در تکمیل این تاپیک همکاری کنند.