将图片压缩至指定大小Kb(Thumbnailator)

本文介绍了如何在SpringBoot-Plus框架下,利用Thumbnailator这个优秀的Java图片处理库,将上传的图片压缩到指定的300kb。在实际操作中,由于图片上传后会被加上UUID,导致了压缩过程中的异常,但通过调整方法成功解决了问题。

放代码前,先唠叨唠叨,舒缓一下我的郁闷之情。

今天下午改一个后台管理系统的需求,要求上传的图片要压缩到300kb,感觉不难,就开搞。

先撩拨一下度娘,搞点货出来瞅瞅,不复杂就干脆搬砖算了。

嗯,度娘不愧为度娘,货不少,找到一个简单(优秀)的一匹的博文,用的是一个优秀的google开源的图片处理的java类库Thumbnailator(想了解么,有大神总结了[Thumbnailator使用简介],和前面那篇差不多,呵呵)。

不过呢,他们只是介绍了这个优秀的类库的使用,而我需要指定将图片压缩到多大,所以说呢,度娘真美,要啥给啥[使用Thumbnails实现图片指定大小压缩],美滋滋,开始搬砖,搬完还要搞其他的事呢。

燃,冰卵,由于开发框架用的是闲大赋团队开发的SpringBoot-Plus的后台管理系统,他的图片上传后,会在图片名称后加上UUID,这就导致了,使用Thumbnailator中的方法输出文件时,会报net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.-找不到合适的图片阅读器的异常,因为后缀不在是图片的后缀了,而是一串UUID。无奈的我,只能想办法解决咯。

幸运的是,有大佬[java图片压缩(Thumbnails)]在,我站上了巨人的肩膀,哈哈哈

好了,不逼逼了,放上代码,记录一下:

SpringBoot-Plus的图片上传方法,略作修改:
/*附件类操作*/
@PostMapping(MODEL + "/uploadAttachment.json")
@ResponseBody
public JsonResult uploadFile(@RequestParam("file") MultipartFile file,String batchFileUUID,String bizType,String bizId) throws IOException {
   
   
    if(file.isEmpty()) {
   
   
        return JsonResult.fail();
    }
    System.out.println(batchFileUUID + "========= type =========   "  + bizType + "   "  + bizId  
<think> 我们参考了引用[1]和引用[3]中的内容。引用[1]提到为每个QPushButton设置固定大小,然后添加到QGridLayout中。引用[3]则具体说明了在网格布局中,将按钮大小策略设定为固定大小(每一个按钮都是128x128),然后使用addWidget函数将按钮添加到布局中。 因此,在QGridLayout中设置固定大小的方法主要是针对每个子部件(如QPushButton)设置固定大小,而不是直接设置QGridLayout的固定大小。因为布局管理器的作用是管理子部件的布局,其本身没有固定大小的概念,而是根据子部件的尺寸和窗口大小来动态调整。 具体步骤: 1. 创建按钮并设置固定大小:使用`setFixedSize(width, height)`方法为每个按钮设置固定大小。 2. 将按钮添加到网格布局中:使用`addWidget`方法将按钮添加到布局的指定行和列。 注意:如果希望布局中的按钮保持固定大小,并且在窗口大小改变时按钮位置能够自适应(比如窗口变大时按钮整体居中,周围有空白),那么需要在布局周围添加弹簧(spacer)或者设置布局的边距和间距,以及设置布局的拉伸系数等。 根据引用[2]的提示,我们还可以使用addSpacing()和addStretch()来调整,但要谨慎。 示例代码(PyQt): ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QSpacerItem, QSizePolicy class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) # 设置布局的边距和间距(可选) grid.setSpacing(10) # 设置按钮之间的间距 grid.setContentsMargins(20, 20, 20, 20) # 设置布局的外边距 # 创建3x3网格的按钮 for row in range(3): for col in range(3): button = QPushButton(f'Btn {row},{col}') # 设置按钮的固定大小 button.setFixedSize(100, 100) # 固定为100x100像素 grid.addWidget(button, row, col) # 添加弹簧(可选): 这里我们可以在布局的四周添加弹簧,使得按钮在窗口变大时仍然居中 # 但是QGridLayout没有直接的方法在行列之间添加弹簧,我们可以在行列索引较大的位置添加弹簧(例如,在最后一行和最后一列之后) # 设置行列的拉伸系数,让多余的空间分配给空白 grid.setRowStretch(3, 1) # 第4行(索引为3)设置拉伸系数为1(如果有4行,则第4行是多余空间) grid.setColumnStretch(3, 1) # 第4列(索引为3)设置拉伸系数为1 self.setWindowTitle('QGridLayout with fixed size buttons') self.setGeometry(300, 300, 400, 400) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_()) ``` 在这个例子中,我们创建了一个3x3的网格布局,每个按钮固定为100x100像素。同时,我们设置了布局的间距和边距。为了在窗口大小改变时保持按钮居中,我们在第4行和第4列设置了拉伸系数(这样多余的空间就会分配给这些行和列,而不是平均分配给所有行列)。注意,网格的行和列索引从0开始,所以第4行索引为3,第4列索引为3。 另外,如果希望按钮在窗口变化时保持固定大小,并且按钮之间的相对位置不变,那么通过设置行列的拉伸系数(将多余的空间分配给空白行列)是一个常用的方法。 总结:在QGridLayout中,布局内的子部件固定大小是通过设置子部件的固定大小(setFixedSize)来实现的。布局管理器会根据子部件的固定大小和布局的设置(如边距、间距、拉伸系数)来动态调整布局。 </think> 在 QGridLayout 中设置固定大小的方法主要是通过控制布局中的子部件(如 QPushButton)来实现的。以下是实现步骤和代码示例: ### 实现步骤 1. **为每个按钮设置固定尺寸** ```cpp QPushButton *button = new QPushButton("Button"); button->setFixedSize(100, 100); // 设置固定宽高 ``` 2. **将按钮添加到网格布局** ```cpp QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(button, 0, 0); // 添加到第0行0列 ``` 3. **设置布局策略** ```cpp // 确保布局不拉伸子部件 gridLayout->setRowStretch(0, 0); gridLayout->setColumnStretch(0, 0); ``` ### 完整代码示例(C++) ```cpp #include <QApplication> #include <QWidget> #include <QGridLayout> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QGridLayout *grid = new QGridLayout(&window); // 创建3x3网格的固定大小按钮 for (int row = 0; row < 3; ++row) { for (int col = 0; col < 3; ++col) { QPushButton *btn = new QPushButton(QString("Btn %1-%2").arg(row).arg(col)); btn->setFixedSize(80, 80); // 固定尺寸80x80 grid->addWidget(btn, row, col); // 禁止行列拉伸 grid->setRowStretch(row, 0); grid->setColumnStretch(col, 0); } } window.setLayout(grid); window.resize(400, 400); window.show(); return app.exec(); } ``` ### 关键要点 1. **`setFixedSize()` 方法** 这是核心方法,直接设置部件的固定尺寸(单位:像素)[^1][^3]。 2. **禁用拉伸系数** 通过 `setRowStretch()` 和 `setColumnStretch()` 将拉伸因子设为 `0`,防止布局管理器调整部件大小[^3]。 3. **布局间距控制** 使用 `setSpacing()` 控制按钮间距: ```cpp grid->setSpacing(10); // 设置10像素间距 ``` ### 注意事项 - 固定尺寸会覆盖部件的 `sizeHint`(推荐尺寸) - 窗口缩小时可能导致部件重叠(需设置最小窗口尺寸) - 对于动态内容(如文本变化的按钮),可能需要重写 `sizePolicy`
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值