1.关于源文件
2.推荐!开箱即用的缩源前端压缩方案(附源码)
3.å¦ä½ä½¿ç¨libjpeg
关于源文件
在计算机操作中,源文件通常指的缩源是原始数据或程序。它们是缩源用户进行各种操作的基础,比如编写代码、缩源制作图像、缩源编辑文档等。缩源调用统计源码源文件的缩源重要性不言而喻,它们是缩源构成最终产品或项目的基石。以将个JPG压缩成一个压缩包为例,缩源我们探讨一下源文件的缩源概念和重要性。
当你使用WinRAR等压缩软件将个JPG压缩成一个压缩包时,缩源这个操作的缩源过程实际上是将这些文件作为源文件进行处理。源文件在这里指的缩源是那些原始的JPG文件,它们是缩源压缩操作的起点和基础。这些文件是缩源未被压缩的原始数据,包含着你想要保存或传输的图像信息。
在进行压缩操作时,html设计器+源码源文件会被软件读取和处理,以减少文件大小,从而提高存储效率或加快传输速度。压缩包作为源文件的压缩结果,它包含了源文件的全部信息,但体积比原始文件小得多。在实际应用中,压缩包的掘客网源码使用非常广泛,尤其是在网络传输、存储空间管理、以及软件分发等领域,可以显著提升效率和降低成本。
源文件的重要性不仅体现在压缩操作上。在软件开发、图像处理、文档编辑等多个领域,新购卡盟源码源文件都是进行操作的基础。源代码是软件开发的起点,图像文件是设计和创意的载体,文档文件则是知识和信息的记录。它们直接决定了最终产品或项目的质量、功能和用户体验。
总之,源文件是源码的位拓展各种操作和应用的基础。无论是将JPG压缩成压缩包,还是编写程序、设计图像、编辑文档,源文件都是不可或缺的起点。理解源文件的概念和重要性,有助于我们更好地进行数据管理、提高工作效率,并在各类项目中发挥关键作用。
推荐!开箱即用的前端压缩方案(附源码)
在互联网竞争激烈的今天,速度至关重要。尽管5G技术已取得显著进步,但过多的大尺寸仍可能导致网页加载缓慢。为解决这一问题,技术开发者们提出了多种压缩方案,比如结合多种技术手段优化。
本文将聚焦于前端层面,分享如何利用原生JavaScript实现从上传到自定义压缩的全过程。无需逐一介绍所有方案,因为网络上已有不少实践案例。我们将重点关注如何通过FileReader API将用户上传的file转换为image对象,然后借助canvas API对进行压缩,以达到指定大小。
首先,将file转为image的代码如下,使用Promise来确保数据生成的顺序和完整性:
... (fileReader代码省略)
接下来,关键的压缩部分,通过调整canvas的宽度和高度,以及调整toBlob参数,可以实现对的自定义压缩:
... (canvas压缩代码省略)
如有对代码的疑问,可在文末留言,我会尽力解答。这个前端压缩方案可以直接应用于实际开发,或者作为基础,进一步创新出更高效、个性化的压缩策略。
å¦ä½ä½¿ç¨libjpeg
æ¬æåªä»ç»jpegå缩çç¸å ³å 容ï¼åå¼å§æè´ªå¾çäºï¼éç¨å¾® 软 çGDI Plusæä¾çåè½ï¼å¾æ¯æ¹ä¾¿ï¼å è·åjpgå¾åçç¼ç ï¼ç¶åæ ¹æ®å¾åçä½å¾æ°æ®å建ä¸ä¸ªBitmapç±»ç对象ï¼åä¿åå¾å为jpgæ ¼å¼å°±è¡äºãä½æ¯æ对 GDI+è¿æ¯å¾ä¿¡ä»»ï¼æ»æè§ä¸è¸å®ï¼æ²¡æçç±çï¼ï¼æ们çç³»ç»ä¸æ¦å®è£ å°±è¦é¿æè¿è¡ï¼æå°±æ¯æ å¿é¿æè¿è¡ä¸æ®µæ¶é´åGDI+ä¼åºé®é¢ï¼ç»æä¹è¯å®äºæçæ å¿ï¼æ们å®é 使ç¨çå¥ç³»ç»ä¸æä¸å¥ï¼è¿ç»è¿è¡3ï¼5天åï¼GDI+å°±ä¼å´©æºï¼äºæ¯æå³å¿éç¨IJG JPEG Libraryãæ¨å¯ä»¥å°
ç«ä¸è½½libjpegçæºç ï¼ IJG JPEG Libraryå°±æ¯jpegå缩åºï¼æ¯ä»¥æºç çå½¢å¼æä¾ç»è½¯ä»¶å¼å人åçï¼å½ç¶å¨è½¯ä»¶å éä¹æç¼è¯å¥½çåºæ件ï¼æ们è¿éå°±åªç¨å°å ¶ä¸ç libjpeg.libï¼jconfig.hï¼jmorecfg.hï¼jpeglib.hè¿å 个æ件ï¼ä¸é¢æå°±ä»ç»ä¸ä¸ææ ·å¨èªå·±çç¨åºéåµå ¥å¾åå缩å è½ã
ããä¸ã建ç«ç¼è¯ç¯å¢
ããæè°å»ºç«ç¼è¯ç¯å¢ï¼å ¶å®é常ç®åï¼å°±æ¯æä¸é¢æå°ç4个æä»¶æ· è´å°ä½ ç项ç®æ件夹ä¸ï¼ælibjpeg.libæ·»å å°ä½ ç项ç®ä¸ï¼ç¶åå¨ä½ å®æå缩åè½çé£ä¸ªæ件éå å ¥#include "jpeglib.h"ï¼éè¦æ³¨æçæ¯ï¼libjpeg.libæ¯ç¨cè¯è¨å¼åçï¼å¦æè¦ç¨å¨ä½ çC++ç¨åºéï¼éè¦ç¨å°extern "C"ï¼å¦ä¸ï¼
// TestLibjpeg.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "memory.h"
extern "C" {
#include "jpeglib.h"
}
ããäºãå缩æ¥éª¤
ãã1ãç³è¯·å¹¶åå§åjpegå缩对象ï¼åæ¶è¦æå®é误å¤çå¨
struct jpeg_compress_struct jcs;
// 声æé误å¤çå¨ï¼å¹¶èµå¼ç»jcs.errå
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
ãã2ãæå®å缩åçå¾åæåæ¾çç®æ æ件ï¼æ³¨æï¼ç®æ æ件åºä»¥äºè¿å¶æ¨¡å¼æå¼
f=fopen(".jpg","wb");
if (f==NULL)
{
delete [] data;
delete [] pDataConv;
return 0;
}
jpeg_stdio_dest(&jcs, f);
ãã3ã设置å缩åæ°ï¼ä¸»è¦åæ°æå¾å宽ãé«ãè²å½©ééæ°ï¼1ï¼ç´¢å¼å¾åï¼3ï¼å ¶ä»ï¼ï¼è²å½©ç©ºé´ï¼JCS_GRAYSCALE表示ç°åº¦å¾ï¼JCS_RGB表示彩è²å¾åï¼ï¼å缩质éçï¼å¦ä¸ï¼
jcs.image_width = nWidth; // 为å¾ç宽åé«ï¼åä½ä¸ºåç´
jcs.image_height = nHeight;
jcs.input_components = 1; // å¨æ¤ä¸º1,表示ç°åº¦å¾ï¼ å¦ææ¯å½©è²ä½å¾ï¼å为3
jcs.in_color_space = JCS_GRAYSCALE; //JCS_GRAYSCALE表示ç°åº¦å¾ï¼JCS_RGB表示彩è²å¾å
jpeg_set_defaults(&jcs);
jpeg_set_quality (&jcs, , true);
éè¦æ³¨æçæ¯ï¼jpeg_set_defaultså½æ°ä¸å®è¦ç设 置好å¾å宽ãé«ãè²å½©ééæ°è®¡è²å½©ç©ºé´å个åæ°åæè½è°ç¨ï¼å 为è¿ä¸ªå½æ°è¦ç¨å°è¿å个å¼ï¼è°ç¨jpeg_set_defaultså½æ°åï¼jpeglib åºéç¨é»è®¤ç设置对å¾åè¿è¡å缩ï¼å¦æéè¦æ¹å设置ï¼å¦å缩质éï¼è°ç¨è¿ä¸ªå½æ°åï¼å¯ä»¥è°ç¨å ¶å®è®¾ç½®å½æ°ï¼å¦jpeg_set_qualityå½æ°ãå ¶å® å¾åå缩æ¶æ好å¤åæ°å¯ä»¥è®¾ç½®ï¼ä½å¤§é¨åæ们é½ç¨ä¸ç设置ï¼åªéè°ç¨jpeg_set_defaultså½æ°å¼ä¸ºé»è®¤å¼å³å¯ã
ãã4ãä¸é¢çå·¥ä½åå¤å®æåï¼å°±å¯ä»¥å缩äºï¼å缩è¿ç¨é常ç®åï¼ é¦å è°ç¨jpeg_start_compressï¼ç¶åå¯ä»¥å¯¹æ¯ä¸è¡è¿è¡å缩ï¼ä¹å¯ä»¥å¯¹è¥å¹²è¡è¿è¡å缩ï¼çè³å¯ä»¥å¯¹æ´ä¸ªçå¾åè¿è¡ä¸æ¬¡å缩ï¼å缩å®æåï¼ è®°å¾è¦è°ç¨jpeg_finish_compresså½æ°ï¼å¦ä¸ï¼
jpeg_start_compress(&jcs, TRUE);
JSAMPROW row_pointer[1]; // ä¸è¡ä½å¾
int row_stride; // æ¯ä¸è¡çåèæ°
row_stride = jcs.image_width; // å¦æä¸æ¯ç´¢å¼å¾,æ¤å¤éè¦ä¹ä»¥3
// 对æ¯ä¸è¡è¿è¡å缩
while (jcs.next_scanline < jcs.image_height) {
row_pointer[0] = & pDataConv[jcs.next_scanline * row_stride];
jpeg_write_scanlines(&jcs, row_pointer, 1);
}
jpeg_finish_compress(&jcs);
ãã5ãæåå°±æ¯éæ¾å缩工ä½è¿ç¨ä¸æç³è¯·çèµæºäºï¼ä¸»è¦å°±æ¯jpegå缩对象ï¼ç±äºå¨æ¬ä¾ä¸ææ¯ç´æ¥ç¨çå±é¨åéï¼æ以åªéè°ç¨jpeg_destroy_compressè¿ä¸ªå½æ°å³å¯ï¼å¦ä¸ï¼
jpeg_destroy_compress(&jcs);
ããä¸ã解å缩æ¥éª¤
ãã解å缩æ¥éª¤ä¸å缩æ¥éª¤é常ç¸ä¼¼ï¼åªæ¯è§£å缩对象为jpeg_decompress_structç±»åï¼æ¥éª¤å¦ä¸ï¼
ãã1ã声æ并åå§å解å缩对象ï¼åæ¶å¶å®é误信æ¯ç®¡çå¨
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
ãã2ãæå¼jpgå¾åæ件ï¼å¹¶æå®ä¸ºè§£å缩对象çæºæ件
FILE *f = fopen(strSourceFileName,"rb");
if (f==NULL)
{
printf("Open file error!\n");
return;
}
//
jpeg_stdio_src(&cinfo, f);
ãã3ã读åå¾åä¿¡æ¯
jpeg_read_header(&cinfo, TRUE);
ãã4ãæ ¹æ®å¾åä¿¡æ¯ç³è¯·ä¸ä¸ªå¾åç¼å²åº
data = new BYTE cinfo.image_width*cinfo.image_height*cinfo.num_components];
ãã5ãå¼å§è§£å缩
jpeg_start_decompress(&cinfo);
JSAMPROW row_pointer[1];
while (cinfo.output_scanline < cinfo.output_height)
{
row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*cinfo.image_width*cinfo.num_components];
jpeg_read_scanlines(&cinfo,row_pointer ,
1);
}
jpeg_finish_decompress(&cinfo);
ãã6ãéæ¾èµæº
jpeg_destroy_decompress(&cinfo);
fclose(f);
ãã好äºï¼å©ç¨IJG JPEG Libraryè¿è¡å¾åå缩就ä»ç»å°è¿éï¼å¸æ对大家ææ帮å©ï¼å®ä¾ä»£ç å·²ç»å®ç°äºå¾åçå缩å解å缩çå ¨é¨åè½ï¼å½ä»¤æ ¼å¼ 为ï¼âTestLibjpeg.exe j|j|b æºæ件å ç®æ æ件åâï¼å ¶ä¸ï¼jé项å°æºæ件å缩为jpgæ ¼å¼ï¼ä¸æ¹åè²å½©æ¨¡å¼ï¼jé项å°æºæ件å缩为为jpgæ ¼å¼ï¼bé项å°æºæ件解å缩为bmpæ ¼å¼ï¼ 该å®ä¾å¹¶æ²¡ææä¾æ件æææ§çéªè¯ï¼å¦æè¦å¼å ¥èªå·±ç代ç ï¼è¯·èªå·±å®ç°æ件æææ§çéªè¯ã