2009-08-17 25 views
1

関数に渡される画像をBitmapFramesの配列として回転させる必要があります。完成した製品をBitmapFrameとして保存する必要があります。そのため、Export-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

もう少し情報がいいです:)あなたが投稿したコードに何が問題なのですか? – cwap

+0

また、Stream(ストリーム)、Bitmap(ビットマップ)、Graphics(またはusing()ブロックで使用しているもの)でDispose()を呼び出すこともできます。 – MusiGenesis

+0

あなたはここでdabonz413の問題に関する詳細情報を推測することができます:http://www.stackoverflow.com/questions/1190743/私はコードを徹底的に調べる時間がありませんでした。私はその質問に2,3週間尋ねました私は完全に新鮮ではありません。しかし、私がもう少し有用な(またはコンテキスト上の)情報を見つけることになったら、私はここに再び投稿します。 – Giffyguy

答えて

1

画像フォーマットが無効であるため、FromStream呼び出しでエラーが発生しているようです。これは多くの理由があり、このコマンドレットがどのように使用されているかわからないため、私は前提をします:

私はここで間違っているかもしれませんが、BitMapFrameの配列を渡しているので、 ProcessRecordが配列要素ごとに1回呼び出されているのではないかと疑問に思っています。真に伝える唯一の方法は、Cmdletがどのように呼び出されているかを確認することです。たとえば、BitMapパラメータがパイプラインから来ている場合、配列内のBitMapFrameごとにProcessRecordが1回呼び出される可能性があります。

それは意味がありますか?

+0

私はコマンドプロンプトでそれを置くコマンドだと言う理解していない:インポートイメージE:\ RawConvert \ lenna.arf | ConvertTo-Rotate 90 |輸出画像E:\ RawConvert \のrotate.jpg それがインポート一配列にすべてのフレームを取得するには、パイプラインを通して送信されるフレームで(90度で)回転レットに送信します。しかし、唯一のループはProcessRecord内にあったので、一度呼び出すと思ったのですが? イメージフォーマットに何が問題なのですか? – dabonz413

+0

パイプレットの一部でforeachオブジェクトも使用されている場合は、毎回ProcessRecordが呼び出されるため、Cmdletの呼び出し方法が不思議でした。これが当てはまる場合、画像フォーマットは間違っていて、なぜFromStreamが失敗しているのか(つまりBitMapFrameの一部しか持たないため)です。 –

+0

上記のようにコマンドを実行すると、ConvertTo-Rotate90コマンドレットが1回だけ呼び出されていることを確認できますか? Import-Imageが配列に渡す各要素に対して一度呼び出される可能性は非常に高いと思われます。 –

関連する問題