2015-09-23 3 views
0

вот мой код:я пытаюсь повернуть изображение, но не вращается

public static Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor) 
{ 
    angle = angle % 360; 
    if (angle > 180) 
     angle -= 360; 

    System.Drawing.Imaging.PixelFormat pf = default(System.Drawing.Imaging.PixelFormat); 
    if (bkColor == Color.Transparent) 
    { 
     pf = System.Drawing.Imaging.PixelFormat.Format32bppArgb; 
    } 
    else 
    { 
     pf = bmp.PixelFormat; 
    } 

    float sin = (float)Math.Abs(Math.Sin(angle * Math.PI/180.0)); // this function takes radians 
    float cos = (float)Math.Abs(Math.Cos(angle * Math.PI/180.0)); // this one too 
    float newImgWidth = sin * bmp.Height + cos * bmp.Width; 
    float newImgHeight = sin * bmp.Width + cos * bmp.Height; 
    float originX = 0f; 
    float originY = 0f; 

    if (angle > 0) 
    { 
     if (angle <= 90) 
      originX = sin * bmp.Height; 
     else 
     { 
      originX = newImgWidth; 
      originY = newImgHeight - sin * bmp.Width; 
     } 
    } 
    else 
    { 
     if (angle >= -90) 
     originY = sin * bmp.Width; 
     else 
     { 
      originX = newImgWidth - sin * bmp.Height; 
      originY = newImgHeight; 
     } 
    } 

    Bitmap newImg = new Bitmap((int)newImgWidth, (int)newImgHeight, pf); 
    Graphics g = Graphics.FromImage(newImg); 
    g.Clear(bkColor); 
    g.TranslateTransform(originX, originY); // offset the origin to our calculated values 
    g.RotateTransform(angle); // set up rotate 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; 
    g.DrawImageUnscaled(bmp, 0, 0); // draw the image at 0, 0 
    g.Dispose(); 

    return newImg; 
} 

и им использовать его здесь:

protected void btnRotateImg_Click(object sender, EventArgs e) 
{ 
    Bitmap bit1 = new Bitmap(Server.MapPath("mydir/img.jpg")); 
    Graphics gbit1 = Graphics.FromImage(bit1); 
    RotateImg(bit1, 100f, Color.FromName(colors.SelectedItem.ToString())); 
    Rectangle r = new Rectangle(0,0,(int)bit1.Width, (int)bit1.Height); 
    bit1.Save(Server.MapPath("mydir/imgnew.jpg")); 
} 

я не знаю, что случилось ..

+0

Что вы делаете с возвращенным новым изображением. с этим ничего не делается. – Codeek

+0

Если это не задание, которое вы должны реализовать, вы можете использовать https://msdn.microsoft.com/en-us/library/system.drawing.image.rotateflip(v=vs.110).aspx и https: //msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.rotation(v=vs.110).aspx, чтобы повернуть ваши растровые изображения с помощью самой платформы .NET. – displayName

ответ

1

Вы не использовали возвращенное изображение растрового изображения. Сохранить возвращаемое значение, как показано ниже в bit1, а затем использовать его:

protected void btnRotateImg_Click(object sender, EventArgs e) 
{ 
    Bitmap bit1 = new Bitmap(Server.MapPath("mydir/img.jpg")); 
    Graphics gbit1 = Graphics.FromImage(bit1); 
    bit1 = RotateImg(bit1, 100f, Color.FromName(colors.SelectedItem.ToString())); // Modification here 
    Rectangle r = new Rectangle(0,0,(int)bit1.Width, (int)bit1.Height); 
    bit1.Save(Server.MapPath("mydir/imgnew.jpg")); 
} 
+3

Боковое примечание: wrap «Bitmap bit1 = new ...» в 'using', иначе у вас будет * утечка ресурсов *. 'using (Bitmap bit1 = new ...) {...}' –

1

вы не используете повернутого изображения, даже если вы возвращаете его

вместо этого:

RotateImg(bit1, 100f, Color.FromName(colors.SelectedItem.ToString())); 

использования :

Bitmap newImage = RotateImg(bit1, 100f, Color.FromName(colors.SelectedItem.ToString())); 

, а затем использовать новыйImage in

Rectangle r = new Rectangle(0,0,(int)newImage.Width, (int)newImage.Height); 
    newImage.Save(Server.MapPath("mydir/imgnew.jpg")); 
Смежные вопросы