Copiar un rectángulo (una parte) de una imagen, para guardarla luego.

15/06/2006 - 22:01 por ralvare | Informe spam
En los eventos mousedown y mouseup recojo las coordenadas del punto con
e.Location y creo un
bonito rectángulo con un graphics.DrawRectangle.

Mi objetivo es convertir en nueva imagen el mapa de bits de dentro del
rectángulo, o sencillamente
poder meter al portapapeles el mapa de bits de dentro del rectangulo.

Son mis primeros pasos por System.Drawing. ¿ Pa donde tiro ahora?

Algun ejemplo... en la web (yo no encuentro ninguno que me sirva)

Gracias foreros.
RAlvare.

Preguntas similare

Leer las respuestas

#1 ralvare.lugones
15/06/2006 - 22:42 | Informe spam
ralvare ha escrito:

En los eventos mousedown y mouseup recojo las coordenadas del punto con
e.Location y creo un
bonito rectángulo con un graphics.DrawRectangle.

Mi objetivo es convertir en nueva imagen el mapa de bits de dentro del
rectángulo, o sencillamente
poder meter al portapapeles el mapa de bits de dentro del rectangulo.

Son mis primeros pasos por System.Drawing. ¿ Pa donde tiro ahora?

Algun ejemplo... en la web (yo no encuentro ninguno que me sirva)

Gracias foreros.
RAlvare.



RAlvare añade: Estoy trabajando sobre un PictureBox en el que pongo la
Image que quiero recortar.
Respuesta Responder a este mensaje
#2 Vyacheslav Popov
16/06/2006 - 00:28 | Informe spam
Mira este ejemplo:
http://www.mistrucos.net/truco-c-re...520_1.aspx

La línea más importante es:
grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), targetX,
targetY, targetW, targetH, GraphicsUnit.Pixel);

escribió en el mensaje
news:

ralvare ha escrito:

En los eventos mousedown y mouseup recojo las coordenadas del punto con
e.Location y creo un
bonito rectángulo con un graphics.DrawRectangle.

Mi objetivo es convertir en nueva imagen el mapa de bits de dentro del
rectángulo, o sencillamente
poder meter al portapapeles el mapa de bits de dentro del rectangulo.

Son mis primeros pasos por System.Drawing. ¿ Pa donde tiro ahora?

Algun ejemplo... en la web (yo no encuentro ninguno que me sirva)

Gracias foreros.
RAlvare.



RAlvare añade: Estoy trabajando sobre un PictureBox en el que pongo la
Image que quiero recortar.
Respuesta Responder a este mensaje
#3 ralvare
16/06/2006 - 18:42 | Informe spam
Mira este ejemplo:
http://www.mistrucos.net/truco-c-re...520_1.aspx



Este es el código del ejemplo:

public static byte[] CropImageFile(byte[] imageFile, int targetW, int
targetH, int targetX, int targetY){ Image imgPhoto = Image.FromStream(new
MemoryStream(imageFile)); Bitmap bmPhoto = new Bitmap(targetW, targetH,
PixelFormat.Format24bppRgb); bmPhoto.SetResolution(72, 72); Graphics
grPhoto = Graphics.FromImage(bmPhoto); grPhoto.SmoothingMode =
SmoothingMode.AntiAlias; grPhoto.InterpolationMode =
InterpolationMode.HighQualityBicubic; grPhoto.PixelOffsetMode =
PixelOffsetMode.HighQuality; grPhoto.DrawImage(imgPhoto, new Rectangle(0,
0, targetW, targetH), targetX, targetY, targetW, targetH,
GraphicsUnit.Pixel); // Save out to memory and then to a file. We
dispose of all objects to make sure the files don't stay locked.
VyaCheslav, no veo cómo puede funcionar esto:Según el código anterior
bmPhoto no contiene nada, salvo datos de su formato y tamaño,al menos yo no
veo donde se asigna un mapa de bits a bmPhoto.MemoryStream mm = new
MemoryStream(); bmPhoto.Save(mm,
System.Drawing.Imaging.ImageFormat.Jpeg); imgPhoto.Dispose();
bmPhoto.Dispose(); grPhoto.Dispose(); return mm.GetBuffer();}

La línea más importante es:
grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH),
targetX, targetY, targetW, targetH, GraphicsUnit.Pixel);

escribió en el mensaje
news:

ralvare ha escrito:
Mi objetivo es convertir en nueva imagen el mapa de bits de dentro del
rectángulo, o sencillamente
poder meter al portapapeles el mapa de bits de dentro del rectangulo.





Sigo con mi objetivo, esta tarde tengo tiempo, hasta que no lo consiga no
paro.

RAlvare.
Cabezón como yo solo.Jejeje.
Respuesta Responder a este mensaje
#4 Vyacheslav Popov
17/06/2006 - 12:49 | Informe spam
Tienes razón, el código del ejemplo es raro...
Pero fíjate en el método DrawImage

Saludos.

"ralvare" escribió en el mensaje
news:%
Mira este ejemplo:
http://www.mistrucos.net/truco-c-re...520_1.aspx



Este es el código del ejemplo:

public static byte[] CropImageFile(byte[] imageFile, int targetW, int
targetH, int targetX, int targetY){ Image imgPhoto =
Image.FromStream(new MemoryStream(imageFile)); Bitmap bmPhoto = new
Bitmap(targetW, targetH, PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(72, 72); Graphics grPhoto =
Graphics.FromImage(bmPhoto); grPhoto.SmoothingMode =
SmoothingMode.AntiAlias; grPhoto.InterpolationMode =
InterpolationMode.HighQualityBicubic; grPhoto.PixelOffsetMode =
PixelOffsetMode.HighQuality; grPhoto.DrawImage(imgPhoto, new
Rectangle(0, 0, targetW, targetH), targetX, targetY, targetW, targetH,
GraphicsUnit.Pixel); // Save out to memory and then to a file. We
dispose of all objects to make sure the files don't stay locked.
VyaCheslav, no veo cómo puede funcionar esto:Según el código anterior
bmPhoto no contiene nada, salvo datos de su formato y tamaño,al menos yo
no veo donde se asigna un mapa de bits a bmPhoto.MemoryStream mm = new
MemoryStream(); bmPhoto.Save(mm,
System.Drawing.Imaging.ImageFormat.Jpeg); imgPhoto.Dispose();
bmPhoto.Dispose(); grPhoto.Dispose(); return mm.GetBuffer();}

La línea más importante es:
grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH),
targetX, targetY, targetW, targetH, GraphicsUnit.Pixel);



escribió en el mensaje
news:

ralvare ha escrito:
Mi objetivo es convertir en nueva imagen el mapa de bits de dentro del
rectángulo, o sencillamente
poder meter al portapapeles el mapa de bits de dentro del rectangulo.





Sigo con mi objetivo, esta tarde tengo tiempo, hasta que no lo consiga no
paro.

RAlvare.
Cabezón como yo solo.Jejeje.

Respuesta Responder a este mensaje
#5 ralvare
18/06/2006 - 00:12 | Informe spam
"Vyacheslav Popov" escribió en el
mensaje news:
Tienes razón, el código del ejemplo es raro...
Pero fíjate en el método DrawImage



Muchas gracias por tu ayuda Vyacheslav.

Ya me está funcionando bien el recorte, pero como no controlo todavia casi
nada de
Graphics, Bitmaps, etc. me cambia la resolución en la imagen recortada a
32bpp y de momento no sé
donde "meter mano" para que se mantenga la resolución original.
De momento no me ayudes más con este asunto que lo voy a intentar yo solo.
No me gusta pedir ayuda nada más que cuando estoy muy perdido y he dado ya
muchas vueltas, porque me parece que sinó no aprendo.


Al final para recortar lo que hago es esto:

//Recorta dejando sólamente el rectángulo "seccion"
static public Bitmap CortaMapaBits(Bitmap bitmapOriginal, Rectangle seccion)

{


//Crear el nuevo mapa de bits y el objeto "graphics" asociado

Bitmap bmp = new Bitmap(seccion.Width, seccion.Height);

Graphics g = Graphics.FromImage(bmp);


// Dibujar la sección del mapa de bits al mapa de bits nuevo

g.DrawImage(bitmapOriginal, 0, 0, seccion, GraphicsUnit.Pixel);

// Limpieza

g.Dispose();

// Devolver el bitmap

return bmp;

}



Pero lo más "dificil" fue la parte del recorte del rectángulo:

/* Al soltar el ratón (mouseUP) se dibuja un rectángulo en rojo con origen
en el punto

* donde se hizo mouseDown. La esquina opuesta del rectángulo está donde se
hizo mouseUp.

En la clase controlraton guardo coordenadas de los puntos donde se pulsa y
suelta el ratón, y se calcula ancho

y alto del rectángulo.

* Fué necesario controlar los ejes de coordenadas para trazar correctamente
los rectángulos. Los distintos casos (1 a 4)

hacen referencia a los cuatro posibles cuadrantes donde se hallen los
vértices opuestos del rectángulo.

* */

private void pictureBox1_MouseUp_1(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

controlraton.verCoorDestino = e.Location;

}

//caso 1

if (controlraton.verCoorOrigen.X > controlraton.verCoorDestino.X

&& controlraton.verCoorOrigen.Y > controlraton.verCoorDestino.Y)

{

controlraton.anchoRectangulo = controlraton.verCoorOrigen.X -
controlraton.verCoorDestino.X;

controlraton.altoRectangulo = controlraton.verCoorOrigen.Y -
controlraton.verCoorDestino.Y;

//El punto destino está en el primer cuadrante (x negativas, y positivas)

controlraton.verCoorOrigen = controlraton.verCoorDestino;

}

//caso 2

if (controlraton.verCoorOrigen.X < controlraton.verCoorDestino.X

&& controlraton.verCoorOrigen.Y > controlraton.verCoorDestino.Y)

{

controlraton.anchoRectangulo = controlraton.verCoorDestino.X -
controlraton.verCoorOrigen.X;

controlraton.altoRectangulo = controlraton.verCoorOrigen.Y -
controlraton.verCoorDestino.Y;

//Punto destino en segundo cuadrante (x e y positivas)

controlraton.verCoorOrigen = new Point(controlraton.verCoorOrigen.X,
controlraton.verCoorDestino.Y);

}

//caso 3

if (controlraton.verCoorOrigen.X < controlraton.verCoorDestino.X

&& controlraton.verCoorOrigen.Y < controlraton.verCoorDestino.Y)

{

controlraton.anchoRectangulo = controlraton.verCoorDestino.X -
controlraton.verCoorOrigen.X;

controlraton.altoRectangulo = controlraton.verCoorDestino.Y -
controlraton.verCoorOrigen.Y;

//Punto origen con coordenadas OK, (x positivas, y negativas)

}

//caso 4

if (controlraton.verCoorOrigen.X > controlraton.verCoorDestino.X

&& controlraton.verCoorOrigen.Y < controlraton.verCoorDestino.Y)

{

controlraton.anchoRectangulo = controlraton.verCoorOrigen.X -
controlraton.verCoorDestino.X;

controlraton.altoRectangulo = controlraton.verCoorDestino.Y -
controlraton.verCoorOrigen.Y;

//punto destino en cuarto cuadrante (x negativas, y negativas)

controlraton.verCoorOrigen = new Point(controlraton.verCoorDestino.X,
controlraton.verCoorOrigen.Y);

}

ExtraerRectangulo();



}
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida