1

このメソッドは、ある画像から別の画像へのピクセルの色を設定します。imageがscreen.pixels配列で大きく見えるように、imgPix配列からscreen.pixels配列にピクセルを設定するにはどうすればよいですか? 概念を理解しやすくするために、コードを簡略化しました。


public void drawSprite(Screen screen)
{
     for(int y = 0; y < 16; y++)
     {
       for(int x = 0; x < 16; x++)
       {        
           screen.pixels[x + y * screen.WIDTH] = this.imgPix[x + y * this.WIDTH];
       }
     }     
}       
4

2 に答える 2

1

私が発見した素敵な小さなトリックは、int にキャストすることです。これは、パターンを繰り返す数を切り捨てます..

// scale = 2  
-------------y = 0,1,2,3,4,5,6,7,8,9  // as y increase.. y++
(int) y/scale = 0,0,1,1,2,2,3,3,4,4 
//  
// out of  10 numbers 5 were drawn this is scaling up   
// As you can see from the above as y increase y/scale repeats with a the correct pattern  
// this happends because casting the (int) rounds down.   
//  
// scale = 0.8  
-------------y = 0,1,2,3,4,5,6,7,8,9  
(int) y/scale = 0,1,2,3,5,6,7,8,10,11  
//  
// out of  10 numbers 2 were skipped this is scaling down an image


    public void drawSprite(Screen screen,Image image,float scale)
    {
         for(int y = 0; y < image.height*scale; y++)
         {
               int scaleY = (int)(y/scale); 

           for(int x = 0; x < image.width*scale; x++)                          
           {                                                    
               int scaleX = (int)(x/scale); 

               screen.pixels[x + y * screen.WIDTH] = image.pixels[scaleX + scaleY * image.width];
           }
         }     
    }  
于 2013-03-14T02:48:24.987 に答える
0

私は以前、programmers.stackexchange.com でこの質問に答えました (関連する Java に十分似ています):

https://softwareengineering.stackexchange.com/questions/148123/what-is-the-algorithm-to-copy-a-region-of-one-bitmap-into-a-region-in-another/148153#148153

--

struct {
    bitmap bmp;
    float x, y, width, height;
} xfer_param;

scaled_xfer(xfer_param src, xfer_param det)
{
    float src_dx = dst.width / src.width;
    float src_dy = dst.height / src.height;
    float src_maxx = src.x + src.width;
    float src_maxy = src.y + src.height;
    float dst_maxx = dst.x + dst.width;
    float dst_maxy = dst.y + dst.height;
    float src_cury = src.y;

    for (float y = dst.y; y < dst_maxy; y++)
    {
        float src_curx = src.x;   
        for (float x = dst.x; x < dst_maxx; x++)
        {
            // Point sampling - you can also impl as bilinear or other
            dst.bmp[x,y] = src.bmp[src_curx, src_cury];
            src_curx += src_dx;
        }

        src_cury += src_dy;
    }
}
于 2012-10-26T06:45:48.493 に答える