Il Framework .Net difetta, nell'implementazione delle API GDI+, di un metodo che permetta di distorcere un'immagine a piacimento dati quattro nuovi vertici di riferimento.
Il metodo DrawImage della classe System.Drawing.Graphics in realtà prevede questa opzione (vedi codice estrapolato tramite Reflector), purtroppo senza averla implementata.
public void DrawImage(Image image, PointF[] destPoints,
RectangleF srcRect, GraphicsUnit srcUnit,
ImageAttributes imageAttr,
Graphics.DrawImageAbort callback, int callbackData)
{
if (destPoints == null)
{
throw new ArgumentNullException("destPoints");
}
if (image == null)
{
throw new ArgumentNullException("image");
}
int num1 = destPoints.Length;
if ((num1 != 3) && (num1 != 4))
{
throw new ArgumentException(SR.GetString("GdiplusDestPointsInvalidLength"));
}
IntPtr ptr1 = SafeNativeMethods.Gdip.ConvertPointToMemory(destPoints);
int num2 = SafeNativeMethods.Gdip.GdipDrawImagePointsRect(
new HandleRef(this, this.NativeGraphics),
new HandleRef(image, image.nativeImage),
new HandleRef(this, ptr1),
destPoints.Length,
srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height,
(int) srcUnit,
new HandleRef(imageAttr, (imageAttr != null) ?
imageAttr.nativeImageAttributes :
IntPtr.Zero),
callback, new HandleRef(null, (IntPtr) callbackData));
Marshal.FreeHGlobal(ptr1);
this.IgnoreMetafileErrors(image, ref num2);
this.CheckErrorStatus(num2);
}
L'idea iniziale è stata quella di sfruttare, quanto più possibile, quello che il Framework mette già a disposizione ed improvvisare una sorta di meshing dell'immagine.
Allo stato attuale la procedura di suddivisione in triangoli (schematizzata sotto) non è iterabile e le maschere di ritaglio non collimano in maniera perfetta. Tant'è; si tratta di un prototipo di soluzione...
Tralascio aspetti e forumle geometriche/trigonometriche ed espongo una demo.
Il metodo utilizzato in questo articolo è da considerarsi tecnicamente superato.
Per una soluzione definitiva del problema, prego fare riferimento a
questo articolo.
Take care. Bye.
Feedbacks
no feedbacks yet.