Ciao gnufy
Ho corretto un errore che si presentava quando la risoluzione del' immagine era diversa da 96 dpi (il valore di default). Si tratta di una sola riga (c' è un commento nel codice) ed era la causa di tutto quello spazio nero.
Ho scritto un progetto web di test e funziona correttamente. Ecco il codice (è in asp.Net):
Parte HTML
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="TestRotation.aspx.vb" Inherits="TestRotation" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:HiddenField ID="HiddenField_Angle" runat="server" Value="0" />
<h1>Test Rotazione</h1>
<asp:Button ID="ButtonRotate" runat="server" Text="Rotate" onclick="ButtonRotate_Click" />
<asp:Button ID="ButtonRestore" runat="server" Text="Restore" onclick="ButtonRestore_Click" />
<br /><br /><br /><br /><br />
<asp:Image ID="Image1" runat="server" ImageUrl="~/images/TestFattura.jpg" />
</form>
</body>
</html>
Parte VB
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Partial Class TestRotation
Inherits System.Web.UI.Page
Protected Sub ButtonRotate_Click(sender As Object, e As System.EventArgs) Handles ButtonRotate.Click
Dim angle As Double
If Not Double.TryParse(HiddenField_Angle.Value, angle) Then
Return
End If
angle += 10
HiddenField_Angle.Value = angle.ToString()
Dim bmpOriginal As Bitmap = New Bitmap(Server.MapPath("images/TestFattura_ori.jpg"))
Dim bmpRotated As Bitmap = Rotation(bmpOriginal, angle)
bmpRotated.Save(Server.MapPath("images/TestFattura.jpg")) ' *** Il mome è diverso dall' originale, che non deve essere modificato ***
bmpOriginal.Dispose()
bmpRotated.Dispose()
Image1.ImageUrl = "images/TestFattura.jpg"
End Sub
Private Function Rotation(ByVal img As Bitmap, ByVal degree As Double) As Bitmap
Dim a = Math.Abs(Math.Cos(degree * Math.PI / 180))
Dim b = Math.Abs(Math.Sin(degree * Math.PI / 180))
Dim w As Integer = img.Width * a + img.Height * b
Dim h As Integer = img.Height * a + img.Width * b
Dim center As PointF = New PointF(w / 2, h / 2)
Dim matrix As New System.Drawing.Drawing2D.Matrix
matrix.RotateAt(degree, center)
Dim bitmap As New Bitmap(w, h)
bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution) ' corregge un errore di risoluzione
Dim g As Graphics = Graphics.FromImage(bitmap)
g.FillRectangle(Brushes.Red, 0, 0, w, h) ' Disegna lo sfondo rosso
g.Transform = matrix
g.DrawImage(img, CInt((w - img.Width) / 2), CInt((h - img.Height) / 2))
Return bitmap
End Function
Protected Sub ButtonRestore_Click(sender As Object, e As System.EventArgs) Handles ButtonRestore.Click
HiddenField_Angle.Value = "0"
System.IO.File.Copy(Server.MapPath("images/TestFattura_ori.jpg"), Server.MapPath("images/TestFattura.jpg"), True)
Image1.ImageUrl = "images/TestFattura.jpg"
End Sub
End Class
Nota che l' angolo totale lo tengo in una variabile hidden, in TestFattura_ori.jpg c' è l' immagine originale che non viene mai sovrascritta, l' immagine che viene visualizzata è TestFattura.jpg.