2009-08-17 5 views
1

Je dois faire pivoter une image qui est transmise à une fonction sous la forme d'un tableau de BitmapFrames. le produit fini doit également être sauvegardé en tant que BitmapFrame afin que je puisse l'envoyer à ma fonction Export-Image. Aidez-moi?Je dois faire pivoter une image

[Cmdlet(VerbsData.ConvertTo, "Rotate")] 
public class RotateCmdlet : PSCmdlet 
{ 
    private BitmapFrame[] bFrame, outFrame; 
    private BitmapSource src; 
    private double pixelsize; 
    private int degrees; 
    private byte[] pixels, outPixels; 

    [Parameter(ValueFromPipeline = true, 
     ValueFromPipelineByPropertyName = true), ValidateNotNullOrEmpty] 
    public BitmapFrame[] Bitmap 
    { 
     get 
     { 
      return bFrame; 
     } 
     set 
     { 
      bFrame = value; 
     } 
    } 

    [Parameter(Position = 0), ValidateNotNullOrEmpty] 
    public int Degrees 
    { 
     get 
     { 
      return degrees; 
     } 
     set 
     { 
      degrees = value; 
     } 
    } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     Console.Write("Rotating the image {0} degrees...\n\n", degrees); 
     outFrame = new BitmapFrame[bFrame.Length]; 
     for (int c = 0; c < bFrame.Length; c++) 
     { 
      Image image; 

      pixelsize = bFrame[c].PixelWidth * bFrame[c].PixelHeight; 
      pixels = new byte[(int)pixelsize]; 
      outPixels = new byte[(int)pixelsize]; 
      bFrame[c].CopyPixels(pixels, (int)(bFrame[c].Width * (bFrame[c].Format.BitsPerPixel/8.0)), 0); 

      Stream strm = new MemoryStream(pixels); 
      image = Image.FromStream(strm); 

      var newBitmap = new Bitmap((int)bFrame[c].PixelWidth, (int)bFrame[c].PixelHeight); 
      var graphics = Graphics.FromImage(newBitmap); 
      graphics.TranslateTransform((float)bFrame[c].PixelWidth/2, (float)bFrame[c].PixelHeight/2); 
      graphics.RotateTransform(degrees); 
      graphics.TranslateTransform(-(float)bFrame[c].PixelWidth/2, -(float)bFrame[c].PixelHeight/2); 
      graphics.DrawImage(image, new System.Drawing.Point(0, 0)); 

      for (int i = 0; i < pixelsize; i++) 
      { 
       outPixels[i] = pixels[i]; 
      } 

      src = BitmapSource.Create(bFrame[c].PixelWidth, bFrame[c].PixelHeight, bFrame[c].DpiX, bFrame[c].DpiY, 
       bFrame[c].Format, bFrame[c].Palette, outPixels, (int)(bFrame[c].Width * (bFrame[c].Format.BitsPerPixel/8))); 
      outFrame[c] = BitmapFrame.Create(src); 
     } 
     WriteObject(outFrame); 
    } 
} 
+0

Un peu plus d'infos serait bien :) Quel est le problème avec le code que vous avez posté, par exemple? – cwap

+0

Aussi (pas pertinent à votre question) vous voulez appeler Dispose() sur tout ce que vous utilisez ici comme Stream, Bitmap et Graphics (ou utilisez-les dans un bloc using()). – MusiGenesis

+0

Vous pourrez peut-être en déduire plus d'informations sur le problème de dabonz413 ici: http://www.stackoverflow.com/questions/1190743/ Je n'ai pas encore eu le temps de parcourir le code à fond, et j'ai posé cette question quelques semaines il y a quelque temps, donc je ne suis pas complètement fraîche. Mais je posterai à nouveau ici si je finis par trouver des informations plus utiles (ou contextuelles). – Giffyguy

Répondre

1

Il semble que l'erreur que vous obtenez sur l'appel FromStream puisse être due au fait que le format de l'image n'est pas valide. Cela pourrait être pour de nombreuses raisons et puisque je ne suis pas sûr exactement comment cette Cmdlet est utilisée, je vais faire une hypothèse:

Je peux être incorrect ici, mais puisque vous passez dans un tableau de BitMapFrame, je ' Je me demande si le ProcessRecord est appelé une fois pour chaque élément du tableau. La seule façon de vraiment le dire est de voir comment vous appliquez Cmdlet. Par exemple, si votre paramètre BitMap provient du pipeline, il y a de fortes chances que ProcessRecord soit appelé une fois pour chaque BitMapFrame du tableau.

Est-ce que cela a du sens?

+0

c'est la commande que je mets dans l'invite de commande pour cela: Import-Image E: \ RawConvert \ lenna.arf | Convertir en rotation 90 | Export-Image E: \ RawConvert \ rotate.jpg il obtient tous les cadres dans un tableau dans l'importation, envoie à la cmdlet de rotation (avec 90 degrés) avec les cadres étant envoyés par pipeline. mais je pensais que puisque la seule boucle était dans le ProcessRecord, elle ne l'appelait qu'une fois? Quel est le problème avec mon format d'image? – dabonz413

+0

J'étais juste curieux de savoir comment la Cmdlet est appelée parce que si elle fait partie du pipeline et foreach-object est également utilisé, alors ProcessRecord est appelé à chaque fois. Si tel était le cas, le format de l'image serait erroné et il le ferait depuis pourquoi FromStream échoue (c'est-à-dire qu'il n'a qu'une partie du BitMapFrame). –

+0

Juste pour être sûr, pouvez-vous valider que lorsque vous exécutez la commande comme vous l'avez indiqué ci-dessus, votre Cmdlet ConvertTo-Rotate90 n'est appelée qu'une seule fois? Il semble qu'il y ait de très bonnes chances qu'il soit appelé une fois pour chaque élément du tableau que l'Import-Image lui transmet. –

Questions connexes