根据宽高缩放加载图片

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        //加载图片
        BitmapFactory.decodeResource(res,resId,options);
        //计算缩放比
        options.inSampleSize = calculateInSampleSize(options,reqHeight,reqWidth);
        //重新加载图片
        options.inJustDecodeBounds =false;
        return BitmapFactory.decodeResource(res,resId,options);
    }

    private static int calculateInSampleSize(BitmapFactory.Options options, int reqHeight, int reqWidth) {
        int height = options.outHeight;
        int width = options.outWidth;
        int inSampleSize = 1;
        if(height>reqHeight||width>reqWidth){
            int halfHeight = height/2;
            int halfWidth = width/2;
            //计算缩放比,是2的指数
            while((halfHeight/inSampleSize)>=reqHeight&&(halfWidth/inSampleSize)>=reqWidth){
                inSampleSize*=2;
            }
        }


        return inSampleSize;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中对jpg图像按照宽高比进行缩放,我们可以使用libjpeg库,这是一个用于读取、修改和创建JPEG图像文件的专业库。下面是一个基本的步骤概述: ### 步骤1: 安装libjpeg库 首先需要安装libjpeg库。在Linux环境下通常可以通过包管理器完成这一操作: ```bash sudo apt-get install libjpeg-dev ``` 对于Windows环境,可能需要下载并手动安装。 ### 步骤2: 编写代码 以下是一个简单的示例,展示了如何使用libjpeg来加载一张图片,并按照给定的比例进行缩放。 ```c #include <stdio.h> #include "jpeglib.h" #include "jerror.h" void resizeImage(int width, int height, FILE *input, FILE *output) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; // 初始化Jpeg解码结构体 cinfo.err = &jerr; cinfo.image_width = width; cinfo.image_height = height; // 打开输入流 if (jpeg_read_header(input, &cinfo) != JDhgSuccess) { fprintf(stderr, "无法读取JPEG头信息。\n"); return; } // 设置解码器的错误处理函数 setjmp(cinfo.err->setjmp_buffer); // 创建Jpeg解码实例 jpeg_create_decompress(&cinfo); // 加载数据到内存缓冲区 jpeg_read_image(input, &cinfo); // 保存到输出流 jpeg_write_scanlines(output, cinfo.output_components, cinfo.output_height); } int main() { const char *inputFilename = "original.jpg"; const char *outputFilename = "resized.jpg"; // 打开输入文件 FILE *inputFile = fopen(inputFilename, "rb"); if (!inputFile) { perror("打开输入文件失败"); return -1; } // 打开输出文件 FILE *outputFile = fopen(outputFilename, "wb"); if (!outputFile) { perror("打开输出文件失败"); fclose(inputFile); return -1; } // 将原始图像宽度设为原图宽度的一半作为新图宽度,保持比例不变 int newWidth = cinfo.image_width / 2; int newHeight = cinfo.image_height / 2; resizeImage(newWidth, newHeight, inputFile, outputFile); // 关闭文件 fclose(inputFile); fclose(outputFile); printf("图像已成功缩放。\n"); return 0; } ``` ### 相关问题: 1. **如何选择合适的宽高比**? 为了保证缩放后的图像视觉效果良好,应该考虑保留原有图像的长宽比例,避免变形。通常选择原始尺寸减半的方式可以同时缩小宽度和高度,但仍保持比例一致。 2. **在实际应用中如何动态获取图像大小**? 可以通过先读入一部分数据来检测图像的实际大小,比如检查前几个像素值是否匹配JPEG头,或者直接使用`jpeg_read_header()`函数,它会自动读取必要的头部信息而无需读取所有数据。 3. **在遇到错误情况时如何处理**? 使用libjpeg库的错误处理机制非常重要。上述代码中的`setjmp`函数用于捕获异常,并通过`jerr`结构体提供详细的错误信息,帮助开发者定位问题所在。 注意:这个示例仅展示了一个基于libjpeg的基本图像缩放过程框架,具体的实现可能会根据实际需求有所不同,例如考虑到更高的性能优化、更好的错误处理策略等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值