9

私はWPFの初心者です。ここで質問があります。幅:360、高さ:360の画像があります。ここで、この画像を次のようにトリミングします。

( 0,0 ) から (120,120) を最初の ImageSource オブジェクトに保存し、

(120,0 ) から (240,120) を 2 番目の ImageSource オブジェクトに保存し、

(240,0 ) から (360,120) を 3 番目の ImageSource オブジェクトに保存します。

……</p>

Pls は下の写真で詳細を参照してください: ここに画像の説明を入力

以下の私のコードサンプル:

    private void CutImage(string img)
    {
        int iLeft = 0;
        int iTop = 0;
        int count = 0;

        Image thisImg = new Image();
        BitmapImage src = new BitmapImage();
        src.BeginInit();
        src.UriSource = new Uri(img, UriKind.Relative);
        src.CacheOption = BitmapCacheOption.OnLoad;
        src.EndInit();
        thisImg.Source = src;

        for (int i = 0; i < 3; i++)
        {
            iTop = i * 120;
            for (int j = 0; j < 3; j++)
            {
                iLeft = j * 120;

                Canvas canvas = new Canvas();

                Rectangle destRect = new Rectangle();
                destRect.SetValue(Canvas.LeftProperty, (double)0);
                destRect.SetValue(Canvas.TopProperty,(double)0);
                destRect.Width = destRect.Height = 120;

                Rect srcRect = new Rect();
                srcRect.X = iLeft;
                srcRect.Y = iTop;
                srcRect.Width = srcRect.Height = 120;


                thisImg.Clip = new RectangleGeometry(srcRect);

                thisImg.Clip.SetValue(Canvas.TopProperty, (double)iTop);
                thisImg.Clip.SetValue(Canvas.LeftProperty, (double)iLeft);
                thisImg.Clip.SetValue(Canvas.WidthProperty, (double)120);
                thisImg.Clip.SetValue(Canvas.HeightProperty,(double)120);

                objImg[count++] = (ImageSource)thisImg.GetValue(Image.SourceProperty);
            }
        }
      }

しかし、期待どおりに機能しません。すべての ImageSource オブジェクトが、コーピング部分ではなく、同じ画像を格納しているようです。誰でも私を助けることができますか?どうも。

4

2 に答える 2

19

これを行うには、CroppedBitmapを使用します。

private void CutImage(string img)
{
    int count = 0;

    BitmapImage src = new BitmapImage();
    src.BeginInit();
    src.UriSource = new Uri(img, UriKind.Relative);
    src.CacheOption = BitmapCacheOption.OnLoad;
    src.EndInit();

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            objImg[count++] = new CroppedBitmap(src, new Int32Rect(j * 120, i * 120, 120, 120));
}
于 2012-09-04T07:25:56.370 に答える