Με το μαλακό κύριοι, ετσι; Δεν έχω παρά μερικες ώρες "πτήσης" σε αυτά τα καινούρια πράγματα του διαβόλου.
Εχω μια σελίδα aspx της οποίας ο μόνος σκοπός είναι να παράγει μια εικόνα, και να χρησιμοποιείται ως SRC στο img tag άλλων σελίδων.
Το contenttype της είναι κάθε φορά αντίστοιχο αυτού που θέλω να παράγω (είτε jpeg είτε png). Το πρόβλημα είναι οτι όταν προσπαθώ να δείξω jpeg τότε εμφανίζεται μια μαύρη εικόνα. Οταν δείχνω png όλα γίνονται σωστά.
Ο κώδικας που τρέχει στη σελίδα είναι ο εξής:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
_filename = Request.QueryString("f")
_text = Request.QueryString("t")
_size = CType(Request.QueryString("s"), Int32)
Dim fm As New FontManager(Server.MapPath(".") + "\abramelin.otf")
Dim s As MemoryStream = fm.GenerateStreamFromTypeface(fm.TypeFaceList(0), _text, _size)
'Dim img As System.Drawing.Image
'img = System.Drawing.Image.FromStream(s)
'img.Save(Response.OutputStream, ImageFormat.Jpeg)
Response.BinaryWrite(s.GetBuffer())
End Sub
Η κλάση FontManager είναι δική μου και τυπώνει fonts. Η GenerateStreamFromTypeface φέρνει ένα stream από το font που έχω προσδιορίσει.
Από εκεί και πέρα είτε πάω το stream σε ένα image object και το κάνω save στο response (αυτό που έχω commented) είτε κάνω binarywrite το stream στο response απευθείας. Δεν υπάρχει καμία παρατηρηθείσα διαφορά μεταξύ των δύο αυτών τρόπων.
Σας παραθέτω και τον κώδικα της GenerateStreamFromTypeface:
Public Function GenerateStreamFromTypeface( _
ByVal tf As Typeface _
, ByVal text As String _
, Optional ByVal fontSize As Int32 = 40 _
, Optional ByVal sizeX As Int32 = 640 _
, Optional ByVal sizeY As Int32 = 480 _
, Optional ByVal dpiX As Int32 = 120 _
, Optional ByVal dpiY As Int32 = 96 _
) As Stream
Dim txt As FormattedText = New FormattedText(text, _
New CultureInfo("el-gr"), _
System.Windows.FlowDirection.LeftToRight, _
tf, _
fontSize, _
System.Windows.Media.Brushes.Black)
Dim drawingVisual As DrawingVisual = New DrawingVisual()
Dim drawingContext As DrawingContext = drawingVisual.RenderOpen()
drawingContext.DrawText(txt, New System.Windows.Point(2, 2))
drawingContext.Close()
Dim bmp As RenderTargetBitmap = New RenderTargetBitmap(sizeX, sizeY, dpiX, dpiY, PixelFormats.Default)
bmp.Render(drawingVisual)
Dim stream As New System.IO.MemoryStream
With (stream)
Dim encoder As JpegBitmapEncoder = New JpegBitmapEncoder()
'encoder.Interlace = PngInterlaceOption.On
encoder.Frames.Add(BitmapFrame.Create(bmp))
encoder.Save(stream)
End With
Return (stream)
End Function
Ολα αυτά βέβαια είναι test.
Το θέμα είναι οτι αν αντί jpegbitmapencoder χρησιμοποιήσω pngbitmapencoder (αλλάζοντας βέβαια και το contenttype της σελίδας που χρησιμοποιεί αυτά τα πράγματα) τότε παίρνω ένα πολύ όμορφο αποτέλεσμα. Στον jpegbitmapencoder όμως παίρνω μαυρη μαυρίλα. Μπορεί κάποιος να με διαφωτίσει στο γιατί (και με το μαλακό);
Σωτήρης Φιλιππίδης
DotSee Web Services