insertar imagen en asp net c#
¿Cómo puedo insertar una imagen en un RichTextBox? (8)
La mayoría de los ejemplos que veo dicen que lo pongan en el portapapeles y usen pegar, pero eso no parece ser muy bueno porque sobrescribe el portapapeles.
Vi un método que colocaba manualmente la imagen en el RTF usando un pinvoke para convertir la imagen a wmf. Es esta la mejor manera? ¿Hay algo más sencillo que pueda hacer?
Esto es lo que hago para hackear el control de texto enriquecido:
Inserte la imagen requerida en Wordpad o MS-WORD. Guarde el archivo como ''rtf''. Abra el archivo rtf en el bloc de notas para ver el código rtf en bruto. Copie las etiquetas y cosas necesarias en la propiedad ''rtf'' de su Cuadro de texto enriquecido (anexe al texto existente).
Hay un poco de prueba y error pero funciona.
Con C #, utilizo los objetos StringBuilder del marcador de posición con el código rtf necesario. Luego añado la ruta de la imagen.
Esta es una solución para no tener que aprender la sintaxis de RTF.
La manera más directa sería modificar el código RTF para insertar la imagen usted mismo.
En RTF, una imagen se define así:
''{'' / pict (brdr? & shading? & picttype & pictsize & metafileinfo?) data ''}'' Un signo de interrogación indica que la palabra de control es opcional. "datos" es simplemente el contenido del archivo en formato hexadecimal. Si desea usar binario, use la palabra de control / bin.
Por ejemplo:
{/pict/pngblip/picw10449/pich3280/picwgoal5924/pichgoal1860 hex data}
{/pict/pngblip/picw10449/pich3280/picwgoal5924/pichgoal1860/bin binary data}
/ pict = inicia un grupo de imágenes, / pngblip = png picture / picwX = ancho de la imagen (X es el valor de píxel) / pichX = altura de la imagen / picwgoalX = ancho deseado de la imagen en twips
Entonces, para insertar una imagen, solo necesita abrir su imagen, convertir los datos a hexadecimal, cargar estos datos en una cadena y agregar los códigos RTF a su alrededor para definir una imagen RTF. Ahora, tiene una cadena independiente con datos de imagen que puede insertar en el código RTF de un documento. No olvides el cierre "}"
A continuación, obtiene el código RTF de su RichTextBox (rtbBox.Rtf), inserte la imagen en la ubicación correcta y establezca el código de rtbBox.Rtf
Un problema con el que se puede encontrar es que .NET RTB no tiene un soporte muy bueno del estándar RTF.
Acabo de hacer una pequeña aplicación * que le permite probar rápidamente algún código RTF dentro de un RTB y ver cómo lo maneja. Puede descargarlo aquí: probador RTB ( http://your-translations.com/toys ).
Puede pegar un poco de contenido RTF (desde Word, por ejemplo) en el cuadro RTF izquierdo y hacer clic en "Mostrar códigos RTF" para visualizar los códigos RTF en el cuadro derecho RTF, o puede pegar el código RTF en el derecho RTB y hacer clic en "Aplicar códigos RTF" para ver los resultados en el lado izquierdo.
Por supuesto, puede editar los códigos a su gusto, lo que lo hace bastante conveniente para probar si RichTextBox admite o no los comandos que necesita, o aprender a usar las palabras de control RTF.
Puede descargar una especificación completa para RTF en línea.
NB. Es solo una pequeña cosa que abofeteé en 5 minutos, así que no implementé el archivo abierto o guardado, arrastrar y soltar, u otras cosas civilizadas.
Mi propia versión que publiqué en un nuevo hilo, aparentemente debería haberla buscado y publicado aquí. De todos modos, usando el portapapeles de nuevo, es muy fácil.
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Images |*.bmp;*.jpg;*.png;*.gif;*.ico";
openFileDialog1.Multiselect = false;
openFileDialog1.FileName = "";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
Image img = Image.FromFile(openFileDialog1.FileName);
Clipboard.SetImage(img);
richTextBox1.Paste();
richTextBox1.Focus();
}
else
{
richTextBox1.Focus();
}
}
}
Si estuvo en C ++, la forma de hacerlo es a través de OLE. Más específicamente, si busca en Google ImageDataObject, mostrará el código C ++ cómo insertar un HBITMAP en el control RTF. Un enlace está here .
Ahora, cómo esto se traduce en el código .Net, no lo sé. Actualmente no tengo tiempo para trabajar a través de los detalles.
También estaba buscando algo para esta misma tarea y encontré esto ->
http://sourceforge.net/projects/netrtfwriter/
Puede generar cualquier tipo de texto RTF que desee y luego usarlo como lo desee. Ejemplo muy bien estructurado que detectará automáticamente el tipo de imagen que se usa (jpg / jpeg / png, etc.) y funcionó para los archivos de imagen que he estado usando. Si tienes prisa, ¡este es un gran generador de RTF!
Todo lo que hice fue hacer un pequeño control pictureBox en c # y me aseguré de que estuviera escondido detrás de otro objeto lo suficientemente grande como para ocultarlo. Luego hice un botón para insertar una imagen, y cargó el pictureBox con la imagen, luego lo coloca en richTextBox y luego borra el control PictureBox.
Aquí está el código.
private void InsertPicture_Click(object sender, EventArgs e)
{
{
if (openFileDialog4.ShowDialog() == DialogResult.OK)
{
// Show the Open File dialog. If the user clicks OK, load the
// picture that the user chose.
pictureBox2.Load(openFileDialog4.FileName);
Clipboard.SetImage(pictureBox2.Image);
pictureBox2.Image = null;
this.richTextBox1.Paste();
}
}
}
Utilizo el siguiente código para obtener primero los datos del portapapeles, guardarlos en la memoria, configurar la imagen en el portapapeles, pegarla en el cuadro de texto enriquecido y finalmente restaurar los datos en el portapapeles.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OpenFileDialog1.Filter = "All files |*.*"
OpenFileDialog1.Multiselect = True
Dim orgdata = Clipboard.GetDataObject
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
For Each fname As String In OpenFileDialog1.FileNames
Dim img As Image = Image.FromFile(fname)
Clipboard.SetImage(img)
RichTextBox1.Paste()
Next
End If
Clipboard.SetDataObject(orgdata)
End Sub
OpenFileDailog1, RichTextBox1 y Button1 son el cuadro de diálogo Abrir archivo, cuadro de texto enriquecido y controles de botón, respectivamente.
private void toolStripButton1_Click(object sender, EventArgs e)
{
FileDialog fDialog = new OpenFileDialog();
fDialog.CheckFileExists = true;
fDialog.CheckPathExists = true;
fDialog.RestoreDirectory = true;
fDialog.Title = "Choose file to import";
if (fDialog.ShowDialog() == DialogResult.OK)
{
string lstrFile = fDialog.FileName;
Bitmap myBitmap = new Bitmap(lstrFile);
// Copy the bitmap to the clipboard.
Clipboard.SetDataObject(myBitmap);
DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap);
// After verifying that the data can be pasted, paste
if(top==true && this.rtTop.CanPaste(format))
{
rtTop.Paste(format);
}
if (btmLeft == true && this.rtBottomLeft.CanPaste(format))
{
rtBottomLeft.Paste(format);
}
if (btmCenter == true && this.rtBottomCenter.CanPaste(format))
{
rtBottomCenter.Paste(format);
}
if (btmRight == true && this.rtBottomRight.CanPaste(format))
{
rtBottomRight.Paste(format);
}
}
}