2012-03-20 33 views
0

C#でGDIライブラリを使用せずに、ファイルからイメージを拡大縮小、回転、および翻訳して表示する必要があります。私はTransformedBitmapオブジェクトとWPFの両方を使って変換を試みました。イメージ操作、変換されたイメージを表示しません

EDIT:I持ってここに

は2つの試みている... GDIを使用するために先に行く:

TransformedBitmap:

BitmapSource mirroredImage = //... 
// Figure out the center of the image 
double centerX = ((double) mirroredImage.Width)/2.0; 
double centerY = ((double) mirroredImage.Height)/2.0; 

// Scale the image 
TransformedBitmap scaledImage = new TransformedBitmap(); 
scaledImage.BeginInit(); 
scaledImage.Source = mirroredImage; 
scaledImage.Transform = new ScaleTransform(test.scale, test.scale, centerX, centerY); 
scaledImage.EndInit(); 

// Rotate the image (from the center of the image) 
TransformedBitmap rotatedImage = new TransformedBitmap(); 
rotatedImage.BeginInit(); 
rotatedImage.Source = scaledImage; 
rotatedImage.Transform = new RotateTransform(test.angle, centerX, centerY); 
rotatedImage.EndInit(); 

// Translate the image 
TransformedBitmap translatedImage = new TransformedBitmap(; 
translatedImage.BeginInit(); 
translatedImage.Source = rotatedImage; 
translatedImage.Transform = new TranslateTransform(test.xShift, test.yShift); 
translatedImage.EndInit(); 

// Display the transformed image 
int width = (int)translatedImage.Source.Width; 
int height = (int)translatedImage.Source.Height; 
int stride = width * ((translatedImage.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

translatedImage.CopyPixels(bits, stride, 0); 

unsafe 
{ 
    fixed (byte* pBits = bits) 
    { 
     IntPtr ptr = new IntPtr(pBits); 

     System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
        width, 
        height, 
        mstride, 
        System.Drawing.Imaging.PixelFormat.Format32bppPArgb, 
        ptr); 

     picMain.Image = bitmap; // picMain is a PictureBox in the Form 
    } 
} 
this.Refresh() // This is in a class inheriting Form 

WPF:

int mwidth = mirroredImage.PixelWidth; 
int mheight = mirroredImage.PixelHeight; 
int mstride = mwidth * ((mirroredImage.Format.BitsPerPixel + 7)/8); 

byte[] mbits = new byte[mheight * mstride]; 

mirroredImage.CopyPixels(mbits, mstride, 0); 

ImageSource scaledImageSrc = BitmapSource.Create(mirroredImage.PixelWidth, mirroredImage.PixelHeight, mirroredImage.DpiX, mirroredImage.DpiY, mirroredImage.Format, mirroredImage.Palette, mbits, mstride); 

System.Windows.Controls.Image scaledImage = new System.Windows.Controls.Image(); 
scaledImage.Source      = scaledImageSrc; 

scaledImage.RenderTransform = new ScaleTransform(test.scale, test.scale, centerX, centerY); 

System.Windows.Controls.Image rotatedImage = new System.Windows.Controls.Image(); 
rotatedImage.Source      = scaledImage.Source; 

rotatedImage.RenderTransform = new RotateTransform(test.angle, centerX, centerY); 

System.Windows.Controls.Image translatedImage = new System.Windows.Controls.Image(); 
translatedImage.Source      = rotatedImage.Source; 

translatedImage.RenderTransform = new TranslateTransform(test.xShift, test.yShift); 

Window main = new Window(); 
main.Title = "Test Image"; 

// Create a Canvas to contain the Image. 
Canvas canvas1 = new Canvas(); 
canvas1.Width = 200; 
canvas1.Height = 200; 
Canvas.SetLeft(translatedImage, 0); 
Canvas.SetTop(translatedImage, 0); 
canvas1.Children.Add(translatedImage); 

main.Content = canvas1; 
main.ShowDialog(); 

これらのすべての結果は、単純にディスプレイです元のmirroredImageの変換された画像を表示するには、translatedImage? (tutorialから)私のFormクラスで

+0

興味があるだけに...なぜあなたはGDIを使用することはできませんか? –

+0

変換中に予期せぬピクセルマッピングに関係するものがありますが、正確にはわかりません。 – vlad417

+0

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

0

機能:変換実行

private Bitmap rotateImage(Bitmap b, TestSettings test) 
    { 
     //create a new empty bitmap to hold rotated image 
     Bitmap returnBitmap = new Bitmap(b.Width, b.Height); 
     //make a graphics object from the empty bitmap 
     Graphics g = Graphics.FromImage(returnBitmap); 
     //move rotation point to center of image 
     g.TranslateTransform((float)b.Width/2, (float)b.Height/2); 
     //rotate 
     g.RotateTransform(test.angle); 
     //move image back 
     g.TranslateTransform(-(float)b.Width/2, -(float)b.Height/2); 
     //draw passed in image onto graphics object 
     g.DrawImage(b, new System.Drawing.Point(0, 0)); 
     return returnBitmap; 
    } 

    private Bitmap scaleImage(Bitmap b, TestSettings test) 
    { 
     //create a new empty bitmap to hold rotated image 
     Bitmap returnBitmap = new Bitmap(b.Width, b.Height); 
     //make a graphics object from the empty bitmap 
     Graphics g = Graphics.FromImage(returnBitmap); 
     //move rotation point to center of image 
     g.TranslateTransform((float)b.Width/2, (float)b.Height/2); 
     //rotate 
     g.ScaleTransform(test.scale, test.scale); 
     //move image back 
     g.TranslateTransform(-(float)b.Width/2, -(float)b.Height/2); 
     //draw passed in image onto graphics object 
     g.DrawImage(b, new System.Drawing.Point(0, 0)); 
     return returnBitmap; 
    } 

    private Bitmap translateImage(Bitmap b, TestSettings test) 
    { 
     //create a new empty bitmap to hold rotated image 
     Bitmap returnBitmap = new Bitmap(b.Width, b.Height); 
     //make a graphics object from the empty bitmap 
     Graphics g = Graphics.FromImage(returnBitmap); 
     //move image 
     g.TranslateTransform(test.xShift, test.yShift); 
     //draw passed in image onto graphics object 
     g.DrawImage(b, new System.Drawing.Point(0, 0)); 
     return returnBitmap; 
    } 

Bitmap inputImage = (Bitmap) Bitmap.FromFile(inputPath); 
Bitmap mirroredImageGDI = new Bitmap(3 * inputImage.Width, 3 * inputImage.Height); 
Graphics mirroredImGfx = Graphics.FromImage(mirroredImageGDI); 

mirroredImGfx.DrawImage(inputImage, //... 

Bitmap scaledImage  = scaleImage(mirroredImageGDI, test); 
Bitmap rotatedImage = rotateImage(scaledImage, test); 
Bitmap translatedImage = translateImage(rotatedImage, test); 

picMain.Image = translatedImage; // PictureBox in my Form 
関連する問題