4

カードのデッキのPNGを1つの画像として持っています(52枚のカードすべてが1つの画像ファイルに結合されています)。必要に応じて個々のカードを抽出するにはどうすればよいですか(または起動時にすべてを別々の画像ファイルに抽出します)。

どの行と列を取得するかを知るロジック、つまり私が問題を抱えている実際の画像操作コードを理解しています。

Visual Studio 2010とVBを使用しています(ただし、どの.NET言語のサンプルコードでもかまいません)。

画像自体を投稿することは許可されていませんが、ここに画像の例を示します

http://www.jfitz.com/cards/windows-playing-cards.png

ありがとう。

4

3 に答える 3

7

これにより、オリジナルが読み込まれ、(0,0) から始まり、サイズが 100x100 のトリミングされたバージョンが作成されます。各カードを反復処理したり、次の行にいつ移動するかを知るなどのロジックを作成する必要があります。ただし、これは、座標と寸法がわかれば、カードを引き出すのに役立ちます。

Bitmap cards = new Bitmap(@"C:\SomePath\");
Rectangle srcRect = new Rectangle(0, 0, 100, 100);
Bitmap card = (Bitmap)cards.Clone(srcRect, cards.PixelFormat);

ところで、保存中に設定するオプションがたくさんあり、質問の範囲外であるため、 card.Save() への呼び出しは含めませんでした。ただし、ディスクに保存する方法については、http://msdn.microsoft.com/en-us/library/ytz20d80.aspx を参照してください。

于 2012-12-15T15:40:02.693 に答える
0
public static System.Drawing.Image CropBitmap(Bitmap bitmap, int cropX, int cropY, int cropWidth, int cropHeight)
        {
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(cropX, cropY, cropWidth, cropHeight);
            System.Drawing.Image cropped = bitmap.Clone(rect, bitmap.PixelFormat);
            return cropped;
        }
于 2012-12-15T15:44:21.477 に答える
0

私は非常に退屈していました。これが役立つかどうかを確認してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace CardDeck
{
    public class CardCropper
    {
        private Bitmap _source;
        private int _cardsPerRow;
        private int _rowCount;
        private int _cardCount;
        private int _cardWidth;
        private int _cardHeight;

        public CardCropper(Bitmap source, int rowCount, int cardsPerRow)
        {
            _source = source;
            _cardsPerRow = cardsPerRow;
            _rowCount = rowCount;
            _cardCount = _cardsPerRow * _rowCount;
            _cardWidth = source.Width / _cardsPerRow;
            _cardHeight = source.Height / _rowCount;
        }

        public Bitmap[,] CropCards()
        {
            var cards = new Bitmap[_rowCount, _cardsPerRow];

            for (int y = 0; y < _rowCount; y++)
            {
                for (int x = 0; x < _cardsPerRow; x++)
                {
                    cards[y, x] = CropCard(x, y);
                }
            }

            return cards;
        }

        private Bitmap CropCard(int x, int y)
        {
            var rect = new Rectangle(x * _cardWidth, y * _cardHeight, _cardWidth, _cardHeight);

            return _source.Clone(rect, _source.PixelFormat);
        }
    }

    public class CardDeck
    {
        private int _limit;
        private int _cardsPerRow;
        private int _index = 0;
        private Bitmap[,] _cards;

        public int Index
        {
            get
            {
                CheckLimits();
                return _index;
            }
            set
            {
                _index = value;
                CheckLimits();
            }
        }

        public CardDeck(Bitmap[,] cards, int rowCount, int cardsPerRow)
        {
            _cards = cards;
            _limit = rowCount * cardsPerRow;
            _cardsPerRow = cardsPerRow;            
        }


        public Image GetCardFromIndex()
        {
            var point = GetPointFromIndex();

            return _cards[point.Y, point.X];
        }

        private void CheckLimits()
        {
            if (_index >= _limit)
            {
                _index = 0;
            }

            if (_index < 0)
            {
                _index = _limit - 1;
            }
        }

        private Point GetPointFromIndex()
        {
            int x = this.Index % _cardsPerRow;
            int y = this.Index / _cardsPerRow;

            return new Point(x, y);
        }
    }
}

使用法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CardDeck
{
    public partial class CardDeckForm : Form
    {
        private CardDeck _cardDeck = null;

        public CardDeckForm()
        {
            InitializeComponent();

            LoadCards();

            ShowImage();
        }

        private void LoadCards()
        {
            using (var source = new Bitmap(@"AllCards.png"))
            {
                var cards = new CardCropper(source, rowCount: 4, cardsPerRow: 13).CropCards();
                _cardDeck = new CardDeck(cards, rowCount: 4, cardsPerRow : 13);
            }
        }

        private void NextButton_Click(object sender, EventArgs e)
        {
            _cardDeck.Index++;
            ShowImage();
        }

        private void PreviousButton_Click(object sender, EventArgs e)
        {
            _cardDeck.Index--;
            ShowImage();
        }

        private void ShowImage()
        {
            this.cardPictureBox.Image = _cardDeck.GetCardFromIndex();
        }
    }
}
于 2012-12-15T15:43:53.787 に答える