【问题标题】:Codename One Image resizing performance代号一图像大小调整性能
【发布时间】:2019-09-17 13:10:18
【问题描述】:

我认为将图像调整为以像素为单位的给定尺寸以显示所需尺寸比使用该图像作为具有所需首选尺寸的Label 的背景更昂贵。你能确认这是真的吗?如果是这样,为什么是真的?

我的意思是,使用如下类(在性能方面)比调整包含图像的大小更好。你认为更快的方法是可能的吗?我需要以固定大小显示大量照片,但我的应用程序不如智能手机的原生图库应用程序快。

/**
 * Button useful to show the given Image at the given size, without the need to
 * resize it.
 *
 * @author Francesco Galgani
 */
public class FixedSizeButton extends Button {

    private final int imageWidth;
    private final int imageHeight;
    private Image image;

    /**
     * Creates a Button displaying an Image at the given fixed size; at least
     * one of imageWidth or imageHeight must be specified.
     *
     * @param image
     * @param imageWidth in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     * @param imageHeight in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     */
    public FixedSizeButton(Image image, int imageWidth, int imageHeight) {
        this(image, imageWidth, imageHeight, null);
    }

    /**
     * Creates a Button displaying an Image at the given fixed size; at least
     * one of imageWidth or imageHeight must be specified.
     *
     * @param image
     * @param imageWidth in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     * @param imageHeight in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     * @param uiid
     */
    public FixedSizeButton(Image image, int imageWidth, int imageHeight, String uiid) {
        this(image, imageWidth, imageHeight, false, uiid);
    }

    /**
     * Creates a Button displaying an Image at the given fixed size; at least
     * one of imageWidth or imageHeight must be specified.
     *
     * @param image
     * @param imageWidth in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     * @param imageHeight in pixels, can be -1 to automatically resize
     * maintaining the aspect ratio
     * @param scaledSmallerRatio force the image to maintain the aspect ratio
     * within the given dimension (it requires that both imageWidth and
     * imageHeight are specified)
     * @param uiid
     */
    public FixedSizeButton(Image image, int imageWidth, int imageHeight, boolean scaledSmallerRatio, String uiid) {
        if (image == null) {
            throw new IllegalArgumentException("image cannot be null");
        }
        if (imageWidth <= 0 && imageHeight <= 0) {
            throw new IllegalArgumentException("invalid imageWidth and imageHeight");
        }
        this.image = image;
        setShowEvenIfBlank(true);
        if (uiid != null) {
            super.setUIID(uiid);
        }
        if (imageWidth < 1) {
            imageWidth = image.getWidth() * imageHeight / image.getHeight();
        } else if (imageHeight < 1) {
            imageHeight = image.getHeight() * imageWidth / image.getWidth();
        }
        if (scaledSmallerRatio) {
            float hRatio = ((float) imageHeight) / ((float) image.getHeight());
            float wRatio = ((float) imageWidth) / ((float) image.getWidth());
            if (hRatio < wRatio) {
                imageWidth = (int) (image.getWidth() * hRatio);
            } else {
                imageHeight = (int) (image.getHeight() * wRatio);
            }
        }
        this.getAllStyles().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT);
        this.getAllStyles().setBgImage(image);
        this.imageWidth = imageWidth;
        this.imageHeight = imageHeight;
    }

    @Override
    public Dimension calcPreferredSize() {
        int width = imageWidth + this.getStyle().getPaddingLeftNoRTL() + this.getStyle().getPaddingRightNoRTL();
        int height = imageHeight + this.getStyle().getPaddingTop() + this.getStyle().getPaddingBottom();
        return new Dimension(width, height);
    }

    /**
     * Returns the background image
     *
     * @return the bg image
     */
    @Override
    public Image getIcon() {
        return image;
    }

    @Override
    public void setText(String text) {
        throw new IllegalStateException("Not supported");
    }

    @Override
    public void setUIID(String id) {
        super.setUIID(id);
        this.getAllStyles().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT);
        this.getAllStyles().setBgImage(image);
    }

}

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    性能足迹/开销各不相同。当您执行Image.scaled (我假设这就是您调整大小的意思...)时,图像可能会逐个像素地遍历并缩小为一个新的更小的字节数组。然后它可能会被重新编码为 PNG 或 JPEG。所有这些都是昂贵的任务。

    请注意,我使用了“可能”这个词,因为 iOS 并不总是这样做,并且在某些情况下使用硬件缩放...

    当您使用绘图时,图像会作为纹理加载到 GPU 中,用于绘制/缩放图像。这具有零开销并且非常快。这里的最大缺点是 RAM,它在常规堆和 GPU 内存中都被占用。所以这是你需要做出的权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2011-01-06
      • 2011-02-21
      • 2014-01-25
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多