大图调整大小显示空白

时间:2018-09-06 14:32:38

标签: skiasharp

在调整大图像(> 6MB,14034px×9921px)的大小时,该过程没有错误,但是图像本身在保存时不会显示,只会显示白色背景画布。

该代码适用于较小的图像。

可以处理多大文件大小有限制吗?

class TestA(unittest.TestCase):

    def setUp(self):
        self.mock_request = Mock()

    @patch('http.server.HTTPServer')
    @patch('my_module.A.do_GET')
    def test_do_get(self, mock_do_get, mock_http_server):
        """Test if do_GET method gets called"""
        mock_do_get.return_value = "/"
        self.mock_request.makefile.return_value = IO(b"GET /")
        server = A(self.mock_request, ('127.0.0.1', 8080), mock_http_server)
        self.assertTrue(mock_do_get.called)
        self.assertEqual(server.do_GET(), "/")

2 个答案:

答案 0 :(得分:0)

我看了一下,发现它与内存缓冲区的最大大小有关。绘制时,skia只能理解最大为size_t的内存。

当以x86运行时,这是4,294,967,295字节。在我的x64机器上,这要大得多。

我试图用46,080x31,320调整RGBA图像的大小,但在以x86运行时失败。这是因为Skia计算得出的值为5,772,902,400字节-溢出。当以x64运行时,调整大小操作成功。

我在Skia论坛上进行了讨论,以查看开发人员的建议:https://getbootstrap.com/docs/4.0/components/modal/

答案 1 :(得分:0)

我裁剪图像并显示两个位图

    SKRect display = CalculateDisplayRect(dest, scale * bitmap.Width, scale * bitmap.Height,
                                                          horizontal, vertical);
 SKRect newDest = new SKRect(display.Left, display.Top, display.Right, display.Bottom/2);
                    SKRect newSource = new SKRect(display.Left, display.Top, display.Right, display.Bottom / 2);
                    //canvas.DrawBitmap(bitmap, display, paint);
                    canvas.DrawBitmap(bitmap, newSource, newDest, paint);
                    SKRect newDest2 = new SKRect(display.Left, display.Top+ display.Bottom / 2, display.Right, display.Bottom );
                    SKRect newSource2 = new SKRect(display.Left, display.Top+ display.Bottom / 2, display.Right, display.Bottom );
                    //canvas.DrawBitmap(bitmap, display, paint);
                    canvas.DrawBitmap(bitmap, newSource2, newDest2, paint);


 static SKRect CalculateDisplayRect(SKRect dest, float bmpWidth, float bmpHeight,
                                           BitmapAlignment horizontal, BitmapAlignment vertical)
        {
            float x = 0;
            float y = 0;

            switch (horizontal)
            {
                case BitmapAlignment.Center:
                    x = (dest.Width - bmpWidth) / 2;
                    break;

                case BitmapAlignment.Start:
                    break;

                case BitmapAlignment.End:
                    x = dest.Width - bmpWidth;
                    break;
            }

            switch (vertical)
            {
                case BitmapAlignment.Center:
                    y = (dest.Height - bmpHeight) / 2;
                    break;

                case BitmapAlignment.Start:
                    break;

                case BitmapAlignment.End:
                    y = dest.Height - bmpHeight;
                    break;
            }

            x += dest.Left;
            y += dest.Top;

            return new SKRect(x, y, x + bmpWidth, y + bmpHeight);
        }