كيفية استخراج جزء من هذه الصورة في جافا؟[مغلق]

StackOverflow https://stackoverflow.com/questions/621835

  •  05-07-2019
  •  | 
  •  

سؤال

لدي هذه الورقة المتحركة:

Pacman sprites

كيف يمكنني قراءة ملف الصورة هذا لاستخراج جزء منه لاستخدامه كملف شبح ?

هل كانت مفيدة؟

المحلول

إذا قرأ المنطقة العفاريت في BufferedImage ، في getSubimage طريقة يمكن استخدامها للحصول على subimage من ورقة العفريت.

وطريقة getSubimage سيأخذ x، y، وwidth وheight من subimage المطلوب، لذلك يمكن الحصول على شبح المطلوب. منذ أكثر من العفاريت يبدو أن نفس الحجم، وأعتقد أن معظمهم يمكن استرجاعها عن طريق حلقة for المتداخلة تكرار خلال صورة كبيرة.

وعلى سبيل المثال، إذا تم تحميل صورة شبح استخدام في الدرجة ImageIO (ومثل في read طريقة )، ولكل العفريت هو 10 بكسل في 10 بكسل في الحجم، حيث هي 5 صفوف من 5 أعمدة من العفاريت، والعفاريت يمكن الحصول عليها عن طريق ما يلي:

BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.

final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        sprites[(i * cols) + j] = bigImg.getSubimage(
            j * width,
            i * height,
            width,
            height
        );
    }
}

والصيد هو، بطبيعة الحال، سوف رمز أعلاه يعمل فقط إذا كان كل العفاريت من نفس الحجم، لذلك سيكون هناك حاجة إلى أن يكون بعض التعديل تنفيذها من أجل العمل على ورقة شبح معين. (كما يبدو في أعلى الزاوية اليمنى لتكون مختلفة في الحجم من الآخرين).

نصائح أخرى

إذا كنت تريد فقط رسم النقوش المتحركة، فإن فئة الرسومات في Java تحتوي على drawImage الطريقة التي ستسحب مساحة معينة من الصورة لك.عليك فقط تحديد الصورة المصدر، حيث تريد رسم الكائن على كائن الرسومات الخاص بك (x، y، العرض، الارتفاع)، وفي أي إطار من الصورة يقع الكائن (x، y، العرض، الارتفاع) .

بافتراض أن عرض وارتفاع الكائن هما نفس العرض والارتفاع الذي تريد رسمه على منطقة الرسم، يمكنك تحديد طريقتك الخاصة لرسم إطار كائن على النحو التالي

void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
                     int columns, int frame, int width, int height)
{
    int frameX = (frame % columns) * width;
    int frameY = (frame / columns) * height;
    g2d.drawImage(source, x, y, x+width, y+height,
                  frameX, frameY, frameX+width, frameY+height, this);
}

columns هو عدد الأعمدة الموجودة في ورقة الرموز المتحركة الخاصة بك.يقوم أول سطرين من الطريقة بحساب موضع x أو y لإطار الكائنات في ورقتك.

ستتطلب تلك النقوش المتحركة الكبيرة الموجودة في ورقتك معالجة خاصة.يمكنك رسمها باستخدام المربعات (بحيث يمكنك رسم أربع نقوش متحركة لكل صورة كبيرة في هذه الحالة)، أو يمكنك يدويًا معرفة x وy والعرض والارتفاع الذي سيتم استخدامه لتلك النقوش المتحركة.

إذا كانت ورقة الكائنات الخاصة بك عبارة عن ورقة عادية (جميع الكائنات بنفس الحجم) وتم ترتيبها بنمط 5 × 15 كما هو الحال لديك، فسترسم الإطار العشرين باستخدام استدعاء الطريقة التالية

Toolkit tk = Toolkit.getDefaultToolkit();    
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);

هنا، x وy هما الموضع الذي تريد رسم الكائن فيه على كائن الرسومات الخاص بك، و15 هو عدد الأعمدة في ورقة الرموز المتحركة، و19 هو الإطار (يبدأ الترقيم من 0)، و25 هو عرض وارتفاع كل منها العفريت (أنا تقريب).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top