我需要旋转图像

时间:2009-08-17 20:12:36

标签: c# powershell rotation

我需要将作为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);
    }
}

1 个答案:

答案 0 :(得分:1)

似乎您在FromStream调用中遇到的错误可能是因为图像格式无效。这可能有很多原因,因为我不确定这个Cmdlet是如何被使用的,我将做出一个假设:

我可能在这里不正确,但是因为你传入了一个BitMapFrame数组,我想知道是否为每个数组元素调用ProcessRecord一次。真正告诉的唯一方法是看看你是如何调用Cmdlet的。例如,如果你的BitMap参数来自管道,那么很有可能为数组中的每个BitMapFrame调用一次ProcessRecord。

这有意义吗?