Convertire un immagine metafile in un jpg

lunedì 17 novembre 2008 - 11.14

ilario Profilo | Senior Member

ciao

ho un'immagine metafile

dim pages as printing.previewpageinfo()

pages(i).image 'questa è un immagine metafile come posso convertirla in un jpg

potrei salvarla con

pages(i).image .save(nomefile, imageformat),

ma vorrei evitare di salvarla su disco è possibile salvarla solo in memoria per poi eliminarla con un .dispose

grazie
ilario

0v3rCl0ck Profilo | Guru

>ciao

Ciao

>
>ho un'immagine metafile
>
>dim pages as printing.previewpageinfo()
>
>pages(i).image 'questa è un immagine metafile come posso
>convertirla in un jpg
>
>potrei salvarla con
>
> pages(i).image .save(nomefile, imageformat),
>
>ma vorrei evitare di salvarla su disco è possibile salvarla
>solo in memoria per poi eliminarla con un .dispose

Potresti utilizzare un MemoryStream:

http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx
http://msdn.microsoft.com/en-us/library/system.io.memorystream_members.aspx

>
>grazie
>ilario
>

Enjoy It

- Michael -
http://blogs.dotnethell.it/Regulator/

ilario Profilo | Senior Member



<Potresti utilizzare un MemoryStream:

pages(i).image .save(nomefile, imageformat),

ho dato un'occhiata a MemoryStream.write se non ho capito male
scrive in memoria una stringa o..... e poi la posso rileggere,

il mio problema è che non so come è composta la stringa

questa riga

pages(i).image .save(nomefile, imageformat),
mi trasforma e salva l'immagine nel formato che voglio
ma come faccio a passagli MemoryStream



per convertire un'immagine ho trovato la classe

imageconverter.convertto ma non riesco a capire come funzioni come dire di trasformarlo in jpg o..

0v3rCl0ck Profilo | Guru

>
>
><Potresti utilizzare un MemoryStream:
>
>pages(i).image .save(nomefile, imageformat),
>
>ho dato un'occhiata a MemoryStream.write se non ho capito male
>scrive in memoria una stringa o..... e poi la posso rileggere,
>
>il mio problema è che non so come è composta la stringa

No, ci puoi salvare quello che vuoi, è uno stream di byte in memoria.

>
>questa riga
>
>pages(i).image .save(nomefile, imageformat),
>mi trasforma e salva l'immagine nel formato che voglio
>ma come faccio a passagli MemoryStream
>

Puoi utilizzare Image.Save Method (Stream, ImageFormat)

Image.Save(MemoryStream, ImageFormat.Jpg)

http://msdn.microsoft.com/en-us/library/ms142147.aspx
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat_members.aspx


- Michael -
http://blogs.dotnethell.it/Regulator/

ilario Profilo | Senior Member

ti ringrazio sono riuscito ho fatto cosi

Dim pages As Printing.PreviewPageInfo() = controller.GetPreviewPageInfo()
Dim IndexPag As Integer

Try
PdfWriter.GetInstance(document, New FileStream(SaveFileDialog1.FileName, FileMode.Create))
document.Open()
Dim immaginestream As MemoryStream = New MemoryStream

For IndexPag = 0 To pages.Length - 1

pages(IndexPag).Image.Save(immaginestream, System.Drawing.Imaging.ImageFormat.Jpeg)
immaginestream.Position = 0

Dim bufferimagine(immaginestream.Length) As Byte
immaginestream.Read(bufferimagine, 0, bufferimagine.Length)

Dim pdfimage As Image = iTextSharp.text.Image.GetInstance(bufferimagine)
document.Add(pdfimage)

immaginestream.Close()
immaginestream.Dispose()

Next IndexPag



Catch de As DocumentException
ShowMessage(de.Message, "Erore", MessageBoxButtons.OK, frmMessaggioBox.mIcon.mStop)
End Try
document.Close()

l'unico problema che mi rimane è che l' imagine è veramente grande oltre le misure del foglio, questo penso che dipenda dalla conversione, sai se esiste un modo per poterla comprimerla?

0v3rCl0ck Profilo | Guru

>l'unico problema che mi rimane è che l' imagine è veramente grande
>oltre le misure del foglio, questo penso che dipenda dalla conversione,
>sai se esiste un modo per poterla comprimerla?
>

Cioè vorresti ridimensionarla?
- Michael -
http://blogs.dotnethell.it/Regulator/

ilario Profilo | Senior Member

come vedi ho usato printdocument

quando mi salva la pagina in jpeg, le dimensioni del file , non corrispondono alle dimensioni effettive della carta

esempio ho salvato una stampa a4 e le dimensioni dell'immagine sono 4801x 7197 889kb capisci che ci posso fare un poster

come posso fare?

0v3rCl0ck Profilo | Guru

>come vedi ho usato printdocument
>
>quando mi salva la pagina in jpeg, le dimensioni del file , non
>corrispondono alle dimensioni effettive della carta
>
>esempio ho salvato una stampa a4 e le dimensioni dell'immagine
>sono 4801x 7197 889kb capisci che ci posso fare un poster
>
>come posso fare?

Ma questo per colpa dell'immagine che è effettivamente è grande?

In questo post, secondo me, puoi trovare utili informazioni per eseguire un resize di una immagine:
http://bytes.com/forum/thread47008.html

Enjoy It

- Michael -
http://blogs.dotnethell.it/Regulator/

ilario Profilo | Senior Member

ciao ho risolto con una funzione ricavaimmagine

mi restituisce byte dell'immagine salvate nel formato e ridotta nelle dimensioni che ho bisogno, così facendo la inserisco poi nel pdf e in un secondo è pronto

sicuramente è da sistemare e migliorare, ma almeno funziona ed è veloce


grazie mille del tuo aiuto

Private Sub pulPdf_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pulPdf.Click

SaveFileDialog1.FileName = DocumentoPrint.DocumentName
SaveFileDialog1.Filter = "File pdf|*.PDF"
SaveFileDialog1.FilterIndex = 1
SaveFileDialog1.Title = "Salva Conto come Pdf"
SaveFileDialog1.OverwritePrompt = False
If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

Dim controller As New Printing.PreviewPrintController
controller.UseAntiAlias = False
DocumentoPrint.PrintController = controller
DocumentoPrint.Print()

Dim pages As Printing.PreviewPageInfo() = controller.GetPreviewPageInfo()
Dim IndexPag As Integer
Dim pageSizePdf As iTextSharp.text.Rectangle = New iTextSharp.text.Rectangle(DocumentoPrint.DefaultPageSettings.PaperSize.Width, DocumentoPrint.DefaultPageSettings.PaperSize.Height)

Dim DocumentPdf As Document = New iTextSharp.text.Document(pageSizePdf) 'pdf


'controlla se landscape = true ruota

If DocumentoPrint.DefaultPageSettings.Landscape = True Then DocumentPdf.PageSize.Rotate()

Try


'nuovo file pdf e inserisci i dati del file autore ecc...

PdfWriter.GetInstance(DocumentPdf, New FileStream(SaveFileDialog1.FileName, FileMode.Create))
DocumentPdf.AddTitle(DocumentoPrint.DocumentName)
'DocumentPdf.AddSubject(DocumentoPrint.DocumentName)
'DocumentPdf.AddCreator("My ")
DocumentPdf.AddAuthor("autore")

DocumentPdf.Open()


For IndexPag = 0 To pages.Length - 1

'inserisci immagine nel pdf
Dim pdfimage As iTextSharp.text.Image
pdfimage = iTextSharp.text.Image.GetInstance(RicavaImmagineByte(pages(IndexPag).Image, DocumentoPrint.DefaultPageSettings.PaperSize.Height, DocumentoPrint.DefaultPageSettings.PaperSize.Width, CmPx.Pixel, 300, DocumentoPrint.DefaultPageSettings.Landscape, System.Drawing.Imaging.ImageFormat.Jpeg))
pdfimage.SetAbsolutePosition(0, 0)

DocumentPdf.Add(pdfimage)

If IndexPag < pages.Length - 1 Then
DocumentPdf.NewPage()
End If
Next IndexPag


Catch de As DocumentException
ShowMessage(de.Message, "Erore", MessageBoxButtons.OK, frmMessaggioBox.mIcon.mStop)
End Try
If DocumentPdf.IsOpen = True Then
DocumentPdf.Close()

End If

End If

End Sub


Private Function RicavaImmagineByte(ByVal Immagine As Drawing.Image, ByVal Altezza As Integer, ByVal larghezza As Integer, ByVal MmoPixel As CmPx, ByVal Dpi As Integer, ByVal landscape As Boolean, ByVal FormatoImmagine As System.Drawing.Imaging.ImageFormat) As Byte()
If landscape = True Then
Dim AltezzaLarghezza As Integer = 0
AltezzaLarghezza = Altezza
Altezza = larghezza
larghezza = AltezzaLarghezza
End If

If MmoPixel = CmPx.Cm Then
Altezza = Altezza / 2.54 * Dpi
larghezza = larghezza / 2.54 * Dpi
End If

Dim ImmagineStream As MemoryStream = New MemoryStream
Dim nuova_immagine As New Bitmap(larghezza, Altezza)
Dim temp As Graphics = Graphics.FromImage(nuova_immagine)

temp.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
temp.DrawImage(Immagine, New Drawing.Rectangle(0, 0, larghezza, Altezza), New Drawing.Rectangle(0, 0, Immagine.Width, Immagine.Height), GraphicsUnit.Pixel)

nuova_immagine.Save(ImmagineStream, FormatoImmagine)

ImmagineStream.Position = 0
Dim bufferimmagine(ImmagineStream.Length) As Byte

ImmagineStream.Read(bufferimmagine, 0, bufferimmagine.Length)
RicavaImmagineByte = bufferimmagine

'riliasciare gli oggetti caricati in memoria
temp.Dispose()
ImmagineStream.Dispose()
nuova_immagine.Dispose()
End Function

grazie mille
ilario

0v3rCl0ck Profilo | Guru

Benone, bravo

Sono contento di esserti stato di aiuto

Alla prossima...
Ciaoooo

- Michael -
http://blogs.dotnethell.it/Regulator/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5