2009-08-17 6 views
1

함수에 전달 된 이미지를 BitmapFrames 배열로 회전해야합니다. 완제품을 BitmapFrame으로 저장해야 내보내기 이미지 기능으로 보낼 수 있습니다. 도움?이미지를 회전해야합니다.

[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

또한 스트림, 비트 맵 및 그래픽과 같이 여기에서 사용하는 모든 항목에 Dispose()를 호출하거나 (using() 블록에서 사용) 질문과 관련이 없습니다. – MusiGenesis

+0

dabonz413의 문제에 대한 자세한 정보는 여기에서 얻을 수 있습니다. http://www.stackoverflow.com/questions/1190743/ 코드를 철저히 조사 할 시간이 없었습니다. 몇 주 동안 질문을했습니다. 전, 전 완전히 그것에 신선한 아니에요. 그러나 더 유용한 (또는 문맥상의) 정보를 찾지 못하면 다시 게시 할 것입니다. – Giffyguy

답변

1

이미지 형식이 유효하지 않기 때문에 FromStream 호출에서 오류가 발생했을 수 있습니다. 이것은 여러 가지 이유가있을 수 있으며이 Cmdlet이 사용되는 방법을 정확하게 알지 못하기 때문에 가정 할 것입니다.

여기에 올바르지 않을 수 있지만 BitMapFrame의 배열을 전달하기 때문에, ProcessRecord이 각 배열 요소에 대해 한 번 호출되는지 궁금합니다. 진정으로 알 수있는 유일한 방법은 Cmdlet이 호출되는 방법을 확인하는 것입니다. 예를 들어, BitMap 매개 변수가 파이프 라인에서 오는 경우 배열의 각 BitMapFrame에 대해 ProcessRecord가 한 번 호출 될 가능성이 있습니다.

의미가 있습니까?

+0

명령 프롬프트에 넣어 명령을 이해가 안 돼요 : 가져 오기 이미지 E : \ RawConvert \ lenna.arf | 변환 - 회전 90 | Export-Image E : \ RawConvert \ rotate.jpg 가져 오기에서 모든 프레임을 배열로 가져오고 파이프 라인을 통해 전송되는 프레임과 함께 rotate cmdlet (90도)을 보냅니다. 하지만 유일한 루프는 ProcessRecord 안에 있었기 때문에 한 번만 호출 할 것이라고 생각했습니다. 내 이미지 형식에 어떤 문제가 있습니까? – dabonz413

+0

파이프 라인의 일부이고 foreach-object도 사용 중이면 ProcessRecord가 호출 될 때마다 Cmdlet을 호출하는 방법이 궁금합니다. 이 경우 이미지 형식이 잘못되어 FromStream이 실패하는 이유 (즉, BitMapFrame의 일부만 포함하기 때문)가 발생합니다. –

+0

위와 같이 명령을 실행하면 ConvertTo-Rotate90 Cmdlet이 한 번만 호출된다는 사실을 확인할 수 있습니까? Import-Image가 전달하는 배열의 각 요소에 대해 한 번 호출된다는 것은 매우 좋은 기회입니다. –

관련 문제