潜域思回
- UID
- 1359
- 主题
- 帖子
- 经验
- 点
- 棉棒
- 根
- 人气
- 点
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
RE: dlsite加密的.dlst格式有办法提取图片吗
本帖最后由 somebelly 于 2019-9-21 01:55 编辑
不提供解决方案,但讲一下思路。
大概看了下play.dlsite.com的源码,每张图片是分块位移后储存的(可以F12,看sources里面play.dl.dlsite.com的内容,是分块位移后的图片)
然后显示的时候通过canvas处理了一下,再分块位移回来
所以解决方法大概是下面两种:
1、使用处理前的图片,模拟canvas处理的过程自己处理一遍(任意语言)
2、把canvas处理后的内容转为图片再下载(网页挂载js脚本)
1可以参考下面的折叠内容(位置在webpack://dll/./node_modules/photoswipe/dist/photoswipe.js 3157行)
2的话参考:
https://stackoverflow.com/questi ... -canvas-to-png-file
https://stackoverflow.com/questi ... element-to-an-image
- _preloadImage = function(item) {
- var preloadImages = [], i = 0, l = 0;
- if(!item.loaded) {
- item.loading = true;
- item.loaded = false;
- }
- // 画像の描画にcanvasを利用するかどうか
- // FIXME: true, false, null, undefined...
- if (item.crypt) {
- item.img = framework.createEl('pswp__img', 'canvas');
- item.img.width = item.w;
- item.img.height = item.h;
- } else {
- item.img = framework.createEl('pswp__img', 'img');
- }
- item.img.style.opacity = '0';
- // 画像のロードを開始
-
- // 見開き
- if(item.page && item.page.length) {
- var maxHeight = item.page.reduce(function (a, b) { return Math.max(a.h, b.h) });
- var page;
- var leftPage;
- for (i=0, l=item.page.length; i<(l|0); i=(i+1)|0) {
- page = item.page[i];
- // 縦中心位置
- if (page.h < maxHeight) {
- page.offsetY = ((maxHeight - page.h) / 2)|0;
- } else {
- page.offsetY = 0;
- }
-
- // 右
- if (i !== 0) {
- leftPage = item.page[i - 1];
- page.offsetX = (leftPage.offsetX + leftPage.w)|0;
- }
- // 左(先に描画)
- else {
- page.offsetX = 0;
- }
-
- preloadImages.push(_loadImage(page, item.img));
- }
- }
- // 単ページ
- else {
- preloadImages.push(_loadImage(item, item.img));
- }
- // すべてのロードが終わったら
- Promise.all(preloadImages)
- .then(function (result) {
- // canvas情報があれば左から順番に描画
- for (i=0, l=result.length; i<(l|0); i=(i+1)|0) {
- if(result[i].c && item.img) {
- _drawCanvas(item.img.getContext('2d'), result[i].img, result[i].c);
- result[i].img = null;
- result[i].c = null;
- }
- }
-
- if (result.length === 1 && result[0].img) {
- item.src = result[0].img.src;
- }
- }, function () {
- item.loadError = true;
- })
- .then(function() {
- item.loading = false;
- item.loaded = true;
-
- if(item.preloader) {
- item.preloader.style.display = 'none';
- item.preloader.innerHTML = '';
- item.preloader = null;
- }
-
- if(item.img) {
- item.img.style.opacity = '1';
- }
-
- if(item.loadComplete) {
- item.loadComplete(item);
- } else {
- item.img = null; // no need to store image object
- }
- });
- return item.img;
- },
- _loadImage = function(item, itemImage) {
- var img = itemImage, crypt;
- if(itemImage.tagName !== 'IMG') {
- img = framework.createEl('pswp__preload', 'img');
- }
- return new Promise(function(resolve, reject) {
- // 画像読み込みが完了
- img.onload = function() {
- // canvas描画処理
- if(itemImage.tagName === 'CANVAS') {
- crypt = {
- crop: 128,
- offsetX: item.offsetX || 0,
- offsetY: item.offsetY || 0,
- w: item.w,
- h: item.h,
- ws: 0,
- hs: 0,
- count: 0,
- s: parseInt(item.key.substring(5, 12), 16),
- p: null
- };
- crypt.ws = Math.ceil(crypt.w / crypt.crop);
- crypt.hs = Math.ceil(crypt.h / crypt.crop);
- crypt.count = crypt.ws * crypt.hs;
- crypt.p = _createCdata(crypt);
- }
- resolve({
- img: img,
- c: crypt
- });
- if(itemImage.tagName !== 'IMG') {
- img = null;
- }
- };
- img.onerror = reject;
- // ダウンロードURLを取得
- if(item.src.indexOf('play://') !== -1) {
- self.getImageUrl(item.src).then(function(url) {
- img.src = url;
- }, function() {
- img.src = item.src;
- });
- // 通常ロード
- } else {
- img.src = item.src;
- }
- });
- },
- /**
- * Canvasに描画
- * @param {CanvasRenderingContext2D} ctx
- * @param {HTMLImageElement} img
- * @param {Object} crypt
- * @private
- */
- _drawCanvas = function(ctx, img, crypt) {
- var isGap = /(iPad|iPhone|iPod)/g.test(navigator.platform);
- var column = 0, row = 0, sx, sy, dx, dy;
- // モザイクタイルの画像を一枚ずつ復元描画
- for (var i = 0, l = crypt.count; i < (l|0); (i = i + 1)|0) {
- sy = (Math.floor((crypt.p[i] * crypt.crop) / (crypt.ws * crypt.crop)));
- sx = crypt.p[i] - (sy * crypt.ws);
- dx = column;
- dy = row;
- ctx.drawImage(
- img,
- sx * crypt.crop,
- sy * crypt.crop,
- crypt.crop,
- crypt.crop,
- // 一部デバイスでタイルに隙間が出来るため、タッチデバイスは0.5を加算
- (dx * crypt.crop - (isGap ? 0.5 : 0)) + crypt.offsetX,
- dy * crypt.crop - (isGap ? 0.5 : 0) + crypt.offsetY,
- crypt.crop + (isGap ? 0.5 : 0),
- crypt.crop + (isGap ? 0.5 : 0)
- );
- column++;
- if(column * crypt.crop >= crypt.w) {
- column = 0;
- row++;
- }
- }
-
- // モザイクタイル化する都合上発生する白余白を消去する
- if (img.width !== crypt.w) {
- ctx.clearRect((crypt.offsetX + crypt.w)|0, crypt.offsetY, (img.width - crypt.w)|0, crypt.h|0);
- }
-
- if (img.height !== crypt.h) {
- ctx.clearRect(crypt.offsetX|0, (crypt.h + crypt.offsetY)|0, crypt.w|0, (img.height - crypt.h)|0);
- }
- },
复制代码 |
|
|