图片的二次采样

默认情况下,bitmap每个像素点占用4个字节(ARGB_8888),比如一张3543×3503的图片差不多在内存中占用44M,安卓系统给每个应用分配的内存都是有限的,可以使用Runtime.getRuntime().maxMemory()来获取内存有限空间。默认情况下图片存储又需要大量的空间,于是就容易产生OOM(out of memory)。
本次需要显示的图片信息:宽高都为3500个像素,大小约为1.1M,通过imageView.setImageResource(R.drawable.bigpic);会产生out of memory,采用二次采样,就可以把图片显示出来。

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.example.dy.getpictrue.R;
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    @ViewInject(R.id.image)
    private ImageView imageView;
    final int MAX_WIDTH = 1000;//定义图片最大的宽
    final int MAX_HEIGHT = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewUtils.inject(this);

//        imageView.setImageResource(R.drawable.bigpic);
        Bitmap bitmap = compressImage();
        imageView.setImageBitmap(bitmap);
    }

    /**
     * 对图片进行二次采样,实际上就是对图片进行压缩
     * 技术关键点就是不用将图片放到内存中,也能测量图片的宽高
     */

    public Bitmap compressImage() {
        //第一次采样
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;//只测量边框,而不把整张图片加载到内存
        BitmapFactory.decodeResource(getResources(), R.drawable.bigpic, options);
        int iWidth = options.outWidth;//测量出实际的宽
        int iHeight = options.outHeight;//测量出实际的高
        int iSimple = 1;//压缩比(采样率),2的倍数,simple等于4,表示压缩到原来的1/4.

        while ((iWidth > MAX_WIDTH) || (iHeight > MAX_HEIGHT)) {
            iSimple = iSimple * 2;
            iWidth = iWidth / 2;
            iHeight = iHeight / 2;
        }
        //第二次采样,根据压缩比压缩图片
        options.inJustDecodeBounds = false;//解码整个压缩后的图片
        options.inSampleSize = iSimple;//设置压缩比
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bigpic, options);
        return bitmap;
    }
}

效果如图:


### 回答1: QCustomPlot 是一个基于Qt框架的图表绘制库,可以用于实现各种静态和动态的数据可视化。QCustomPlot的二次开发指的是在QCustomPlot的基础上进行定制化的开发,以满足特定的需求。 QCustomPlot提供了丰富的功能和灵活的接口,可以轻松地绘制各种类型的图表,如曲线图、柱状图、散点图等。它还支持自定义图表的外观和交互行为,包括调整坐标轴、添加标题和子标题、设置图表背景、绘制网格线等。 QCustomPlot的二次开发可以通过以下几个方面来实现。首先,可以根据项目要求自定义图表的外观,如修改颜色、线型和符号的样式,以及添加背景图片和阴影效果。其次,可以添加交互功能,如鼠标悬停提示、数据选择和缩放等,以提供更好的用户体验。 此外,QCustomPlot还支持动态更新图表,可以实时显示数据的变化情况。在二次开发中,可以利用这个功能实现实时数据的监控和展示。例如,在工业控制系统中,可以通过QCustomPlot将传感器数据可视化,实时呈现设备状态和变化趋势。 QCustomPlot还可以与Qt中的其他模块和类进行整合,以实现更复杂的功能。例如,可以使用Qt的网络模块从远程服务器获取数据,然后通过QCustomPlot进行绘制和展示。 综上所述,QCustomPlot的二次开发可以根据具体需求来增加、修改和定制图表的功能和外观,以实现更多样化和个性化的数据可视化效果。 ### 回答2: QCustomPlot是一个开源的Qt绘图库,它提供了一系列的绘图工具和功能,包括曲线绘制、图表绘制、坐标系设置等。在QCustomPlot中进行二次开发,可以根据自己的需求进行定制和扩展,增加特定的功能和样式。 QCustomPlot的二次开发可以从以下几个方面入手: 1. 数据源:可以通过二次开发,将不同的数据源与QCustomPlot结合起来。比如,可以从数据库、网络或其他文件中读取数据,并进行绘图展示。也可以通过实时数据更新的方式,将实时数据显示在曲线或图表上。 2. 绘图样式:QCustomPlot提供了一些默认的样式,但二次开发可以通过自定义样式来增加个性化的图表展示。可以调整线条的颜色、粗细、曲线的类型,修改图表的背景、坐标轴的标签、刻度等。 3. 交互功能:可以通过二次开发,添加一些交互式的功能。例如,可以实现放大缩小、平移、拖拽等操作,以便用户在绘图上进行交互。也可以添加工具栏、菜单等界面元素,提供更多的操作选项。 4. 数据处理:可以通过二次开发,在QCustomPlot上进行数据处理和分析。例如,可以对绘图数据进行滤波、平滑、峰值检测等操作,以便更好地展示和分析数据。 5. 导出和保存:可以通过二次开发,增加数据导出和保存的功能。可以将绘制的图表保存为图片,或者导出数据为文件,以方便用户进行后续的处理和使用。 通过以上的二次开发,可以根据具体需求定制化QCustomPlot,使其更加符合自己的项目要求。需要注意的是,在二次开发过程中,需要具备Qt和绘图相关的知识和经验,以便更好地理解和使用QCustomPlot库。 ### 回答3: QCustomPlot是一个非常强大的开源绘图库,可以用于绘制二维图形和图表。通过二次开发,我们可以根据自己的需求对其进行定制和扩展。 QCustomPlot的二次开发可以包括以下几个方面的内容: 1. 绘图定制:通过修改绘图函数、调整绘图参数等方式,可以实现各种各样的绘图效果。例如,可以改变线条颜色、线型、点的形状,添加背景图像或标签等。 2. 数据处理:可以通过二次开发,对绘图数据进行处理和分析。例如,可以实现数据滤波、数据采样、数据拟合等功能,从而在绘图时展示更加准确和精细的数据。 3. 交互功能:可以通过二次开发,添加交互式的功能,使用户能够与绘图进行互动。例如,可以添加鼠标拖动、缩放、平移等功能,使用户可以自由浏览和操作图形。 4. 扩展功能:QCustomPlot还可以通过二次开发,集成其他相关功能。例如,可以与其他界面库结合,实现更加丰富的用户界面;也可以与数据存储库结合,实现数据的保存和读取功能等。 总之,QCustomPlot的二次开发可以根据具体需求进行定制和扩展,从而实现更加个性化和强大的绘图功能。无论是改变绘图样式、处理数据、添加交互功能,还是集成其他功能,QCustomPlot都可以通过二次开发来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值