как Sprite программно выполняет обрезку в cocos2dx? - PullRequest
0 голосов
/ 06 августа 2020

Изображение может быть с прозрачными пикселями. Как получить минимальный размер прямоугольника, который подходит к этому изображению, без прозрачных пикселей? Хочу получить примерно такое:

cocos2d::Rect getBoundingBoxTrim(cocos2d::Sprite* sprite);

Возможно, вы не дадите мне ответа, но хоть несколько советов. Буду Вам очень признателен.

1 Ответ

2 голосов
/ 10 августа 2020

Это просто пример c. Вам нужно будет его настроить.

Image* img = new Image();
img->initWithImageFile("my file.png");

Затем вы перебираете каждый пиксель изображения и определяете, какие пиксели на границе изображения непрозрачны, и используете это для вычисления прямоугольника.

int leftMost;
int rightMost;
int upperMost;
int lowerMost;

unsigned char *data = new unsigned char[img->getDataLen()*x];   
    data = img->getData();

for(int i=0;i<img->getWidth();i++)
    {
        for(int j=0;j<img->getHeight();j++)
        {
            unsigned char *pixel = data + (i + j * img->getWidth()) * x;
            
           // You can see/change pixels' RGBA value(0-255) here !
            // unsigned char r = *pixel;
            // unsigned char g = *(pixel + 1);
            // unsigned char b = *(pixel + 2) ;
            unsigned char a = *(pixel + 3);

            if (a>0){
            // this pixel is opaque. You can use a different threshold for transparency besides 0, depending on how transparent you won't to consider as "transparent".
                 

                     //Complete yourself: 
                if(i<leftMost){
                     leftMost = i;
                }
                if(i> rightMost){
                    rightMost = i;
                }
                if(j> upperMost){
                    upperMost = j;
                }
                if(j< lowerMost){
                    lowerMost = j;
                }
                }
            }
        }

В разделе «Завершите себя» вы просто отслеживаете границу, где находится первый / последний непрозрачный пиксель. Вам нужны четыре переменные, по одной для каждой стороны.

В конце l oop вы просто создаете прямоугольник, используя четыре точки в качестве сторон прямоугольника!

Если это решает ваша проблема, отметьте ее как правильную.

...