update
This commit is contained in:
39
lib/image-cap.js
Normal file
39
lib/image-cap.js
Normal file
@@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
const { nativeImage } = require('electron');
|
||||
|
||||
const PREVIEW_BYTES = 12 * 1024; // >12 KB → needs resizing for inline preview
|
||||
const SOFT_CAP_BYTES = 2 * 1024 * 1024; // 2 MB
|
||||
const RESIZE_WIDTH = 800; // 大图压到这个宽度,保证 SOFT_CAP_BYTES 不爆
|
||||
|
||||
/**
|
||||
* Returns { buf, preview }.
|
||||
* - buf: input buffer unchanged.
|
||||
* - preview: null if the buffer is < PREVIEW_BYTES (12 KB), otherwise the
|
||||
* literal string '[图片]'. The caller (main.js) is responsible for
|
||||
* actually resizing when buf.length > SOFT_CAP_BYTES (2 MB); the
|
||||
* preview marker is purely a signal that the buffer is non-trivial.
|
||||
*/
|
||||
function capImage(buf) {
|
||||
const b = Buffer.isBuffer(buf) ? buf : Buffer.from(buf || []);
|
||||
if (b.length < PREVIEW_BYTES) return { buf: b, preview: null };
|
||||
return { buf: b, preview: '[图片]' };
|
||||
}
|
||||
|
||||
/**
|
||||
* 把图片 buffer 按 SOFT_CAP_BYTES 收纳:超出的图压成 RESIZE_WIDTH 宽。
|
||||
* 三处共用:pollClipboard / bringFavoriteIntoHistory。
|
||||
*
|
||||
* 返回 { buf, preview },preview 由 capImage 给出(无图/小图 = null),
|
||||
* 给数据库的 preview 列用。
|
||||
*/
|
||||
function normalizeImageForStorage(buf) {
|
||||
const cap = capImage(buf);
|
||||
// 小图/空图:直接原样入库
|
||||
if (!cap.preview) return cap;
|
||||
if (cap.buf.length <= SOFT_CAP_BYTES) return cap;
|
||||
// 大图:nativeImage 重新编码到 RESIZE_WIDTH 宽,PNG 重编码比原图小一个数量级
|
||||
const img = nativeImage.createFromBuffer(cap.buf);
|
||||
return { buf: img.resize({ width: RESIZE_WIDTH }).toPNG(), preview: cap.preview };
|
||||
}
|
||||
|
||||
module.exports = { capImage, normalizeImageForStorage, PREVIEW_BYTES, SOFT_CAP_BYTES, RESIZE_WIDTH };
|
||||
Reference in New Issue
Block a user