2010-04-21 17 views
8

Tengo un problema realmente extraño con el método Graphics.DrawImage.C# winforms: graphics.DrawImage problema

Tengo el control PictureBox en el control del Panel con propiedad AllowScroll = verdadero. El programa corta la imagen en piezas pequeñas basándose en el área seleccionada por el usuario.

me carga la imagen de 300x547 y seleccionar el área (rectángulo rojo):

programa

alt text http://img341.imageshack.us/img341/8796/63796391.png

corta correctamente la imagen:

alt text http://img689.imageshack.us/img689/6459/69242903.png

entonces, me carga otra imagen 427x640 :

alt text http://img34.imageshack.us/img34/7950/56727000.png

y luego, como resultado, veo que la imagen no está cortada correctamente. Cada archivo tiene una anchura adecuada img.jpg & altura, pero la imagen dibujada es demasiado pequeño: alt text http://img641.imageshack.us/img641/1977/25643796.png

aquí está el fragmento de código - que guarda el área de mapa de bits seleccionado por el usuario:

Image OriginalIMG= (Image)((PictureBox)panel1.Controls["picBox"]).Image.Clone() 
    Bitmap bmp = new Bitmap(selectedAreaRECT.Width, selectedAreaRECT.Height); 
    Graphics g = Graphics.FromImage(bmp); 

    g.DrawImage(OriginalIMG, 0,0, selectedAreaRECT, GraphicsUnit.Pixel); 
    g.Save(); 
    g.Dispose(); 

    bmp.Save(AppDomain.CurrentDomain.BaseDirectory + @"\Temp\" + "img1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

Como se ve, el código es el mismo para img1.jpg de la imagen A y de la imagen B. Estoy tratando de resolver ese estúpido problema por mucho tiempo, no sé cuál es la razón de ese problema. Probé diferentes sobrecargas del método DrawImage, sin éxito

EDITAR

Resuelto! el valor predeterminado de DPI del System.Drawing.Bitmap es = 96, si abro una imagen con DPI! = 96, se produce el problema descrito anteriormente. Para deshacerse de él, que necesitaba usar el método SetResolution:

Bitmap result = new Bitmap(width, height); 
result.SetResolution(OriginalIMG.HorizontalResolution, OriginalIMG.VerticalResolution); 

que resuelve el problema :) Gracias por todo el mundo en busca de ayuda! :)

+2

¿Has mirado las propiedades DPI de esas imágenes? –

+0

¿Quiere decir HorizontalResolution y VerticalResolution? Son = 96 – Tony

+7

Buenas fotos :-) – Steven

Respuesta

3

que iba a tratar: (editado)

g.DrawImage(
    OriginalIMG, 
    new Rectangle(Point.Empty, bmp.Size), 
    selectedAreaRECT.X, selectedAreaRECT.Y, 
    selectedAreaRECT.Width, selectedAreaRECT.Height, 
    GraphicsUnit.Pixel); 

para ver si se hace una diferencia.

Aunque no tiene nada que ver con su problema: se está olvidando de .Disponer() algunas cosas, y no estoy seguro de por qué tiene que .Clone() la imagen.

+0

no hay ningún constructor como el suyo – Tony

+0

Constructor? ¿Te refieres al método? Opps, voy a actualizar ... –

Cuestiones relacionadas