导航:首页 > 文件处理 > cpng图片压缩

cpng图片压缩

发布时间:2022-10-07 16:36:26

❶ 关于png文件的编辑疑问(质量问题)

1。PNG是LZ77无损压缩派生的一种位图格式。
2。编辑多次看你做的是什么样的编辑,有的时候是会改变的。
3。多次编辑转换,原图肉眼看不见或者不察觉,但是是有改变的。
4。压缩原理很复杂。我告诉你,你愿意看吗?
1.1 索引图与 RGB 图 对于 PNG 图像,可以分为索引(Index)图和 RGB 图两种,索引图只包含固定数量的颜 色,而 RGB 图的颜色数量是不受限制的. RGB 图的每一个象素都保存一个 RGB 值,代表这个象素的颜色,因此,一张 RGB 图有多 少个象素,文件中就保存多少个 RGB 值. 而索引图会将其固定数量的颜色,按照顺序排列起来,作为颜色的索引保存在文件头中,被 称为调色板(palette).每一个象素只保存其颜色在调色板中的索引. 如一个 32 色的索引图,在文件头中保存了 32 个颜色,索引值从 0 到 31.图中每一个象 素只记录其颜色的索引. 因此,对于一般的 PNG 图,索引图文件的大小总是小于 RGB 图的.
1.2 行程压缩原理 当我们把一张索引图的所有象素(N 个) ,按照从上到下,从左至右,即按行扫描的顺序排 列起来的时候,我们得到一个队列.如果我们用 1 个字节来存储一个象素 的索引值(调色板颜色不超过 256) ,那么数据的大小为 N 字节.这段数据的格式我们表示 为 [I1][I2]…[In] 共 N 个. 在上面的队列中,可能会出现很多连续相同的索引值,最多的就是透明色.如果我们在每个 索引值前用 1 个字节保存这个值连续出现的数量(最多可以表示 256 个 ) ,那数据的格式变为 [C1][I1][C2][I2]…[Cm][Im] 共 M 个.那么一张 256 个象素的 单色图的所有数据,只需要 2 个字节来保存.通常,我们所需的图中总 是有大片连续的颜色,包括透明色,因此按照这个格式保存的图像,其文件大小可以大大降 低,这就是行程的压缩原理.
1.3 USI 压缩原理 如果一张索引图的颜色数为 32,那么在[C1][I1][C2][I2]…[Cm][Im] 格式中,I 的数值 都小于 32,那么每个字节前 3 bits 始终为 0.为了充分利用这 3 bits,我们可以将 C 的值保存在这 3bits 中,这样我们的格式变为 [G1][G2]….[Gk] 共 K 个(G 的高位为数量,低位为颜色索引) .这样,对于 32 色的图, 每个字节最多可以保存 8 个象素的信息, 对于 64 色的图, 每个字节最多可以保存 4 个象素 的信息,对于 16 色的图,每个字节最多可以保存 16 个象素的信息. 在 [G1][G2]….[Gk] 这 K 个字节前,再加上调色板数据和其它本图的必要信息,就得到 了 USI 格式的文件.
conan(29842977) 15:03:01 1.1 载入文件
private void load(String file) {
try {
DataInputStream din = new
DataInputStream(getClass().getResourceAsStream(file));
m_flags = din.readInt();
//格式标志
/** 读取调色板信息 */
m_count = din.readByte() & 0xff; //调色板位数
m_mask = 0xff >> (8 - m_count); //计算 取色板索引的掩码
int pal_count = din.readByte() & 0xff; //调色板数量
int pal_len = din.readByte() & 0xff; //调色板长度 即颜色数
m_pal = new int[pal_count][pal_len]; //初始化调色板容器
int pal; //读取调色板信息
for (int i = 0; i < pal_count; i++) { for (int j = 0; j < pal_len; j++) { pal = din.readShort() & 0xffff; m_pal[i][j] = ( ( ( ( (pal & 0xF000) >>> 12) * (17 << 24)) & 0xFF000000) | ( ( ( (pal & 0x0F00) >>> 8) * (17 << 16)) & 0x00FF0000) | ( ( ( (pal & 0x00F0) >>> 4) * (17 << 8)) & 0x0000FF00) | ( ( ( (pal & 0x000F) * 17))) ); } } /** 读取图块信息 */ m_modelCount = din.readShort() & 0xffff; //图块数量 //读取图块尺寸 if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { //基于尺寸的转换方式 m_rebuildWidth = din.readByte() & 0xff; m_rebuildHeight = din.readByte() & 0xff; } else if ( (m_flags & FLAG_REBUILD_MODULE) != 0) { //基于动画 model 的转换方式 m_models = new byte[m_modelCount * 2]; din.read(m_models); } /** 读取像素数据 */ m_dataSize = din.readInt(); //像素数据大小(压缩数据) m_data = new byte[m_dataSize]; din.read(m_data); //读取像素数据(压缩数据) //读取每个图块数据的起始偏移量 int offset = 0; m_dataOffset = new int[m_modelCount]; for (int i = 0; i < m_modelCount; i++) { m_dataOffset[i] = offset; if ( (m_flags & FLAG_16BIT_4_LEN) != 0) { offset += din.readShort(); } else { offset += din.readByte() & 0xff; } } } catch (Exception ex) {} } 1.2 解压缩 /****************************************** * 解压缩指定图块像素数据 * @param model_id int 图块号 * @param pal_id int 调色板号 * @return int[] 解压缩图块像素数据(ARPG 值) ******************************************/ private int[] BuildRle8bFrm(int model_id, int pal_id) { //计算解压后,像素数据的大小(图块 W*图块 H) int size; if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { size = m_rebuildWidth * m_rebuildHeight; } else { size = (m_models[model_id * 2] & 0xff) * (m_models[model_id * 2 + 1] & 0xff); } //初始化像素 buf int[] m_bufB = new int[size]; int pal[] = m_pal[pal_id]; //获取当前调色板 int offset = m_dataOffset[model_id]; //获取压缩数据起点 //解压缩 int count, index, pos = 0; while (pos < size) { count = ( (m_data[offset] & 0xFF) >> m_count) + 1; index = pal[m_data[offset] & m_mask]; offset++; while (--count >= 0) { m_bufB[pos++] = index; } } return m_bufB; } /********************************** * 获取指定图块 Image * @param model_id int 图块号 * @param pal_id int 调色板号 * @return Image 图块 Image 对象 **********************************/ public Image GetImage(int model_id, int pal_id) { //获得指定图块解压数据(ARPG 颜色数据) int[] m_bufB = BuildRle8bFrm(model_id, pal_id); //计算图块尺寸 int w, h; if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { w = m_rebuildWidth; h = m_rebuildHeight; } else { w = m_models[model_id * 2] & 0xff; h = m_models[model_id * 2 + 1] & 0xff; } //生成 Image 图片 Image m_image = Image.createRGBImage(m_bufB, w, h, true); m_bufB = null; return m_image; }

❷ 上传图片时让我压缩到1M以下,怎样压缩

a、打开任意浏览器,点击浏览器的搜索框,在这里搜索图片压缩,选择网页搜索,我们要找到下载工具的网页,将工具下载安装到我们的电脑。

e、最后我们点击文件页面上的“开始压缩”按钮,对图片文件进行压缩。

❸ 如何将隐藏于图片(jpg,png,gif,ico)当中(压缩文件rar)显示出来

你说的是把机密文件伪装为
gif
图片是的话右击解压缩就行了(双击也显示)
把需要隐藏的文件用
WinRAR
打包压缩为
rar
文件,然后准备一张
gif
格式的图片。接下来下载一款名为
UltraEdit

16
进制文件编辑器。
UltraEdit
是一款文字、
Hex

ASCII
码编辑软件,可以以
16
进制方式对
EXE

DLL
文件进行编辑。

我们的目的是将
rar
文件隐藏在
gif
文件中。当别人点击这个
gif
文件时看到的将是一幅图像,这样就可以将机密文件隐藏起来了。如果你自己想查看其中的秘密时,可以把伪装后的
gif
文件改名为
rar
文件,点击它就会启动
WinRAR
,就可以看到里面隐藏的文件了。你也可以先运行
WinRAR
,将它的主窗口拖动得小一点,然后用鼠标左键拖动伪装后的
gif
文件到
WinRAR
窗口中,松开鼠标左键,在
WinRAR
中就会显示出你隐藏在其中的机密文件。有谁能想到一个
gif
图片中竟然隐藏着这么大的秘密呢!

安装完毕运行
UltraEdit
,用它打开事先准备好的任意一个
gif
文件,建议您选择的这个
gif
文件大小不要太小,否则加入
rar
文件后体积会变大,一个图像很小的
gif
文件,文件大小却非常大,会引起别人的怀疑。打开
gif
文件之后,再用
UltraEdit
打开那个含义机密文件的
rar
文件,此时你会看到该文件的
16
进制代码,按
Ctrl+A
键选定整个
rar
文件的代码,按
Ctrl+C
键复制这些代码,再转到
UltraEdit
打开的
gif
文件中,按
Ctrl
键和
End
键来到
gif
文件代码的最后,在最后一个代码之前(即倒数第
2
个代码处),按
Ctrl+V
键插入刚刚复制的
rar
文件的代码,点击“文件”菜单中的“保存”,这样就把
gif
文件和
ZIP
文件合并在一起了。现在,再也没有人能知道你的秘密了!

❹ 怎么把 PNG的图像格式 转换成JPEG格式

你想怎么改,手工可以直接改后缀名
也可以把图片复制到画图中,然后另存为JPEG格式的文件
在MFC中有一个CImage类,可以读取PNG图像格式文件,然后可以用save成员函数存为JPEG格式的图片文件

❺ ps如何设置png图片大小刚好能够包裹图片

没太明白你所要表达的意思。就图片缩放说一下吧。图片a与图片b放置在一起首先需要统一分辨率,这样放在一起不会有一张太虚,具体是在图片上框上点右键,选择图像大小,调整成一致的分辨率。

❻ 200分c/c++/java/c#读取png图片

没必要那么麻烦.只要使用GDI+库里面的Bitmap对象和Graphics对象就可以了。WindowsXP以上的OS都提供GDI+图形接口了,他的功能比GDI接口更强大,使用更方便。建议你可以查查GDI+的用法。这里给你个最简单的C#的例子:
System.Drawing.Bitmap bmp = new Bitmap("1.png");//创建Bitmap对象
System.Drawing.Color c = bmp.GetPixel(0, 0);//获得图像上(0,0)点的像素值
int a = c.A;//该像素的Alpha通道值
int r = c.R;//该像素的红色通道值
int g = c.G;//该像素的绿色通道值
int b = c.B;//该像素的蓝色通道

那建议你上网查一查PNG格式的标准,就知道PNG文件里的数据排列了。但PNG是压缩过的,所以你还得有解压算法才行。

png的存储格式:

关键数据块中有4个标准数据块:

文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。

调色板数据块PLTE(palette chunk):必须放在图像数据块之前。

图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。

图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束。

在第二个数据块中包含了调色板数据块。可是,当我们去解析png24时,却未找到调色板、并且我们发现png24的存储模式是点阵颜色值加一位的阿尔法通道值构成的,这种存储模式根本不需要调色板的存在。基于这种存储模式,png24的位深最低是32位真彩,在我们看到的图像过渡中会很圆润,因为每个点都可以是不同的色彩以及不同的透明值。而这种模式也是我们最常使用、大家所理解中的png模式。至于"png"后面的“24”可见也和位深并无关系,至于为什么叫24,我也没有找到具体的答案。

png24源数据中无调色盘的存在,而在标准数据块的第二块中,却显示了调色板数据块。即然存在,肯定是有意义的,可见png有另外一种存储模式--带色盘的png8模式。png8有点类似于GIF,包含了一个调色板,并在调色板上有一个透明颜色值,这种模式在计算机的存储中,每个点阵存储的是色盘索引、并且无阿尔法半透明位。所以,png8在颜色位深上,可以低于32位;也可以使用更换色盘的技术来处理一些独特的效果;但是由于每个点阵没有阿尔法定义,边缘会像GIF一样存在锯齿现像。

好像讲的有点乱,总结一下区别吧:

png8和png24的根本区别,不是颜色位的区别,而是存储方式不同;

png8 色盘索引、调色板中一位透明值、不支持阿尔法通道的半透明,存储格式中每个像素无透明度的数据块定义;

png24 无调色板、支持阿尔法通道的半透明、每个点阵都有透明度的定义,最低32位真彩色;

特性

支持256色调色板技术以产生小体积文件

最高支持48位真彩色图像以及16位灰度图像。

支持阿尔法通道的半透明特性。

支持图像亮度的gamma校正信息。

支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。

使用无损压缩

渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。

使用CRC循环冗余编码防止文件出错。

最新的PNG标准允许在一个文件内存储多幅图像。

看。有使用无损压缩和多幅图像。挺复杂的哦!

http://codex.wordpress.org.cn/index.php?diff=prev&oldid=88484

看下面W3C的网站介绍。你就知道有多复杂了。不用库函数,我觉得你的想法太不现实。对与BMP这样格式还可以,对于PNG,不行。

http://www.w3.org/TR/2003/REC-PNG-20031110/

❼ 图像格式jpg、jpeg、jpe、gif、png、png等有何不同

一,格式大小不同

1,jpg格式:即为jpeg格式,是通过压缩改变画质和文件尺寸的格式。

2,jpeg格式:网络上流行图像格式,一般简称为jpg格式,是可把图像文件压缩到最小的格式。

3,gif格式:即为图像交换格式,能够处理色数最大为256色的图像格式。

4,png格式:png可以对图像进行无损压缩,并且压缩体积比jpg格式要小得多。

5,bmp格式:Windows中使用的标准图像格式。

二,适用范围不同

1,jpg格式:压缩后恶化的图像无法还原,使用于数字图像及Web中的照片中。

2,jpeg格式:由于体积小,因此非常适合应用与互联网,可减少图像的传输时间,也普遍应用于需要连续色调的图像。

3,gif格式:适用于存储色数少的插图以及Web图像。

4,png格式:支持透明效果可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。

5,bmp格式:由于无法压缩,因此缺点是文件容量太大,使用于Windows壁纸等方面。

(7)cpng图片压缩扩展阅读:

EXIF格式

其实与JPEG格式相同,区别是除保存图像数据外,还能够存储摄影日期、使用光圈、快门、闪光灯数据等曝光资料和附带信息以及小尺寸图像。

DXF格式

DXF是Drawing Exchange Format的缩写,扩展名是.dxf,是AutoCAD中的图形文件格式,它以ASCII方式储存图形,在表现图形的大小方面十分精确,可被Corel Draw和3DS等大型软件调用编辑。

参考资料来源:网络_图像格式

❽ 怎样把图片的文件大小缩小呢!

将图片文件大小变小方法:


1、首先鼠标移到图片上,点击右键,选择最下面的属性,可以看到图片有208KB。


❾ 怎样将图片压缩算法转换

deflate就是zip的主压缩算法,也用在png文件中。
store就是不压缩存储
没说清楚你的应用情况,你如果是编程开发者,
C语言用zlib可以把deflate数据解压出来
java用zip库,
根据要求变成颜色模型数据存储。

❿ 您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片

举例:
public static void main(String[] args) {
try {
//从特定文件载入
BufferedImage bi = ImageIO.read(new File("c:\test.png"));
bi.getSubimage(0, 0, 10, 10);//前两个值是坐标位置X、Y,后两个是长和宽
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 图片工具类
* 压缩图片大小
* @author Cyw
* @version 1.0
*/
public class ZIPImage {

private File file = null;

private String outPutFilePath;

private String inPutFilePath;

private String inPutFileName;

private boolean autoBuildFileName;

private String outPutFileName;

private int outPutFileWidth = 100; // 默认输出图片宽

private int outPutFileHeight = 100; // 默认输出图片高

private static boolean isScaleZoom = true; // 是否按比例缩放

public ZIPImage() {
outPutFilePath = "";
inPutFilePath = "";
inPutFileName = "";
autoBuildFileName = true;
outPutFileName = "";
}

/**
*
* @param ipfp
* 源文件夹路径
* @param ipfn
* 源文件名
* @param opfp
* 目标文件路径
* @param opfn
* 目标文件名
*/
public ZIPImage(String ipfp, String ipfn, String opfp, String opfn) {
outPutFilePath = opfp;
inPutFilePath = ipfp;
inPutFileName = ipfn;
autoBuildFileName = true;
outPutFileName = opfn;
}

/**
*
* @param ipfp
* 源文件夹路径
* @param ipfn
* 源文件名
* @param opfp
* 目标文件路径
* @param opfn
* 目标文件名
* @param aBFN
* 是否自动生成目标文件名
*/
public ZIPImage(String ipfp, String ipfn, String opfp, String opfn,
boolean aBFN) {
outPutFilePath = opfp;
inPutFilePath = ipfp;
inPutFileName = ipfn;
autoBuildFileName = aBFN;
outPutFileName = opfn;
}

public boolean isAutoBuildFileName() {
return autoBuildFileName;
}

public void setAutoBuildFileName(boolean autoBuildFileName) {
this.autoBuildFileName = autoBuildFileName;
}

public String getInPutFilePath() {
return inPutFilePath;
}

public void setInPutFilePath(String inPutFilePath) {
this.inPutFilePath = inPutFilePath;
}

public String getOutPutFileName() {
return outPutFileName;
}

public void setOutPutFileName(String outPutFileName) {
this.outPutFileName = outPutFileName;
}

public String getOutPutFilePath() {
return outPutFilePath;
}

public void setOutPutFilePath(String outPutFilePath) {
this.outPutFilePath = outPutFilePath;
}

public int getOutPutFileHeight() {
return outPutFileHeight;
}

public void setOutPutFileHeight(int outPutFileHeight) {
this.outPutFileHeight = outPutFileHeight;
}

public int getOutPutFileWidth() {
return outPutFileWidth;
}

public void setOutPutFileWidth(int outPutFileWidth) {
this.outPutFileWidth = outPutFileWidth;
}

public boolean isScaleZoom() {
return isScaleZoom;
}

public void setScaleZoom(boolean isScaleZoom) {
this.isScaleZoom = isScaleZoom;
}

public String getInPutFileName() {
return inPutFileName;
}

public void setInPutFileName(String inPutFileName) {
this.inPutFileName = inPutFileName;
}

/**
* 压缩图片大小
*
* @return boolean
*/
public boolean compressImage() {
boolean flag = false;

try {
if (inPutFilePath.trim().equals("")) {
throw new NullPointerException("源文件夹路径不存在。");
}
if (inPutFileName.trim().equals("")) {
throw new NullPointerException("图片文件路径不存在。");
}
if (outPutFilePath.trim().equals("")) {
throw new NullPointerException("目标文件夹路径地址为空。");
} else {
if (!ZIPImage.mddir(outPutFilePath)) {
throw new FileNotFoundException(outPutFilePath
+ " 文件夹创建失败!");
}
}

if (this.autoBuildFileName) { // 自动生成文件名
String tempFile[] = getFileNameAndExtName(inPutFileName);
outPutFileName = tempFile[0] + "_cyw." + tempFile[1];
compressPic();
} else {
if (outPutFileName.trim().equals("")) {
throw new NullPointerException("目标文件名为空。");
}
compressPic();
}

} catch (Exception e) {
flag = false;
e.printStackTrace();
return flag;
}

return flag;
}

// 图片处理
private void compressPic() throws Exception {
try {
// 获得源文件
file = new File(inPutFilePath + inPutFileName);
if (!file.exists()) {
throw new FileNotFoundException(inPutFilePath + inPutFileName
+ " 文件不存在!");
}
Image img = ImageIO.read(file);
// 判断图片格式是否正确
if (img.getWidth(null) == -1) {
throw new Exception("文件不可读!");
} else {
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (ZIPImage.isScaleZoom == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) img.getWidth(null))
/ (double) outPutFileWidth + 0.1;
double rate2 = ((double) img.getHeight(null))
/ (double) outPutFileHeight + 0.1;

// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;

newWidth = (int) (((double) img.getWidth(null)) / rate);
newHeight = (int) (((double) img.getHeight(null)) / rate);

} else {
newWidth = outPutFileWidth; // 输出的图片宽度
newHeight = outPutFileHeight; // 输出的图片高度
}

BufferedImage tag = new BufferedImage((int) newWidth,
(int) newHeight, BufferedImage.TYPE_INT_RGB);

/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
*/
tag.getGraphics().drawImage(
img.getScaledInstance(newWidth, newHeight,
Image.SCALE_SMOOTH), 0, 0, null);

FileOutputStream out = new FileOutputStream(outPutFilePath
+ outPutFileName);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();

}
} catch (IOException ex) {
ex.printStackTrace();
}
}

/**
* 创建文件夹目录
*
* @param filePath
* @return
* @throws Exception
*/
@SuppressWarnings("unused")
private static boolean mddir(String filePath) throws Exception {
boolean flag = false;
File f = new File(filePath);
if (!f.exists()) {
flag = f.mkdirs();
} else {
flag = true;
}
return flag;
}

/**
* 获得文件名和扩展名
*
* @param fullFileName
* @return
* @throws Exception
*/
private String[] getFileNameAndExtName(String fullFileName)
throws Exception {
String[] fileNames = new String[2];
if (fullFileName.indexOf(".") == -1) {
throw new Exception("源文件名不正确!");
} else {
fileNames[0] = fullFileName.substring(0, fullFileName
.lastIndexOf("."));
fileNames[1] = fullFileName
.substring(fullFileName.lastIndexOf(".") + 1);
}
return fileNames;
}

public Image getSourceImage() throws IOException{
//获得源文件
file = new File(inPutFilePath + inPutFileName);
if (!file.exists()) {
throw new FileNotFoundException(inPutFilePath + inPutFileName
+ " 文件不存在!");
}
Image img = ImageIO.read(file);
return img;
}

/*
* 获得图片大小
* @path :图片路径
*/
public long getPicSize(String path) {
File file = new File(path);
return file.length();
}

}

//下面是测试程序

package com.sun.util.cyw;

import java.awt.Image;
import java.io.IOException;

public class ImageTest {
public static void main(String[] args) throws IOException {
ZIPImage zip=new ZIPImage("d:\","1.jpg","d:\test\","处理后的图片.jpg",false);
zip.setOutPutFileWidth(1000);
zip.setOutPutFileHeight(1000);

Image image=zip.getSourceImage();
long size=zip.getPicSize("d:\1.jpg");
System.out.println("处理前的图片大小 width:"+image.getWidth(null));
System.out.println("处理前的图片大小 height:"+image.getHeight(null));
System.out.println("处理前的图片容量:"+ size +" bit");

zip.compressImage();
}
}

阅读全文

与cpng图片压缩相关的资料

热点内容
java地址重定向 浏览:268
一年级下册摘苹果的算法是怎样的 浏览:448
程序员出轨电视剧 浏览:88
服务器系统地址怎么查 浏览:54
解压游戏发行官 浏览:601
国外小伙解压实验 浏览:336
顶级大学开设加密货币 浏览:437
java重载与多态 浏览:528
腾讯应届程序员 浏览:942
一键编译程序 浏览:129
语音加密包哪个好 浏览:339
有什么学习高中语文的app 浏览:282
安卓手机的表格里怎么打勾 浏览:409
阿里云服务器有网络安全服务吗 浏览:968
超解压兔子视频 浏览:24
单片机怎么测负脉冲 浏览:174
魅族备份的app在哪里 浏览:740
java倒三角打印 浏览:115
通达信回封板主图源码 浏览:46
战地什么服务器 浏览:301