我有一些.GIF格式的图像,我想压缩.但我得到的输出相同或几乎没有2-5%压缩.我需要更高的压缩比,以便网页可以快速加载.目前我正在使用gifsicle工具,但几乎没有发现生成的gif图像的大小有太大差异.我从雅虎选择了这个工具.
gifsicle -O3 gifimage1.gif -o new-gifimage1.gif
Run Code Online (Sandbox Code Playgroud) 我需要能够在运行时压缩PNG文件,但找不到任何可以做到这一点的iOS就绪的库.JPEG确实不适合我,因为我需要PNG提供的Alpha通道,而JPEG则不需要.将PNG粉碎变成我可以在我的iOS项目中使用的东西可能超出了我的技能/知识集.
为了更清楚,我需要在运行时执行此操作,而不是编译时.
我一直在尝试在Vulkan中使用S3TC(BC/DXT)压缩加载压缩图像,但到目前为止我没有太多运气.
以下是Vulkan规范关于压缩图像的内容:
https://www.khronos.org/registry/dataformat/specs/1.1/dataformat.1.1.html#S3TC:
使用S3TC压缩图像格式存储的压缩纹理图像被表示为4×4纹素块的集合,其中每个块包含64或128位纹素数据.该图像被编码为普通的2D光栅图像,其中每个4×4块被视为单个像素.
https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-images:
对于使用线性平铺创建的图像,rowPitch,arrayPitch和depthPitch描述了线性内存中子资源的布局.对于未压缩格式,rowPitch是相邻行中具有相同x坐标的纹素之间的字节数(y坐标相差一).arrayPitch是纹素之间的字节数,在图像的相邻数组层中具有相同的x和y坐标(数组层值相差一).depthPitch是在3D图像的相邻切片中具有相同x和y坐标的纹素之间的字节数(z坐标相差1).表示为寻址公式,子资源中texel的起始字节具有地址:
//(x,y,z,layer)是texel坐标
address(x,y,z,layer)= layer arrayPitch + z depthPitch + y rowPitch + x texelSize + offset
对于压缩格式,rowPitch是相邻行中压缩块之间的字节数.arrayPitch是相邻阵列层中块之间的字节数.depthPitch是3D图像的相邻切片中的块之间的字节数.
//(x,y,z,layer)是块坐标
address(x,y,z,layer)= layer arrayPitch + z depthPitch + y rowPitch + x blockSize + offset;
对于未创建为数组的图像,未定义arrayPitch.depthPitch仅针对3D图像定义.
对于颜色格式,VkImageSubresource的aspectMask成员必须为VK_IMAGE_ASPECT_COLOR_BIT.对于深度/模板格式,方面必须是VK_IMAGE_ASPECT_DEPTH_BIT或VK_IMAGE_ASPECT_STENCIL_BIT.在分别存储深度和模板方面的实现上,查询每个子资源布局将返回不同的偏移量和大小,表示用于该方面的内存区域.在存储深度和模板方面交错的实现上,返回相同的偏移和大小并表示交叉存储器分配.
我的图像是普通的2D图像(0层,1个mipmap),因此没有arrayPitch或depthPitch.由于硬件直接支持S3TC压缩,因此应该可以在不对其进行解压缩的情况下使用图像数据.在OpenGL中,这可以使用glCompressedTexImage2D来完成,这在过去对我有用.
在OpenGL中,我使用了GL_COMPRESSED_RGBA_S3TC_DXT1_EXT作为图像格式,对于Vulkan,我使用的是VK_FORMAT_BC1_RGBA_UNORM_BLOCK,它应该是等效的.这是我映射图像数据的代码:
auto dds = load_dds("img.dds");
auto *srcData = static_cast<uint8_t*>(dds.data());
auto *destData = static_cast<uint8_t*>(vkImageMapPtr); // Pointer to mapped memory of VkImage
destData += layout.offset(); // layout = VkImageLayout of the image …Run Code Online (Sandbox Code Playgroud) 从pagespeed我只获得图像链接和可能的字节和百分比优化,如压缩和调整大小https://example.com/...ts/xyz.jpg?036861可以节省212KiB(减少51%).压缩https://example.com/...xyz.png?303584508可以节省4.4KiB(减少21%).
举个例子,我有300kb的图像,对于这个图像,pagespeed显示100kb和30%的缩小.
这仅适用于一张图片,但我相信我会有很多图像用于压缩.那么如何通过将字节或百分比作为参数或使用java中的任何其他计算(通过使用API或图像处理工具)来压缩图像,这样,我可以获得谷歌建议的压缩版图像.
提前致谢.
java image image-processing image-compression google-pagespeed
我在科学背景下进行图像处理.每当我需要将图像保存到硬盘驱动器时,我希望能够在以后重新打开它,并在保存之前获得我所拥有的数据.我专门使用PNG格式,一直以来都认为它是无损格式.如果我没有使用错误的位深度,这总是正确的吗?编码器和解码器根本不起作用吗?具体来说,我保存的图像
imwrite()函数编码,例如cv2.imwrite("image.png", array)在处理了具有透明度的先前优化的索引颜色PNG图像之后(参见此处针对某些背景,因为该问题涉及相同的图像文件),使用以下代码,PLTE块似乎扩展为具有比有效使用的颜色更多的颜色.
Mu当前代码:
#!/usr/bin/env/python3
import os
from PIL import Image
source_file = os.path.expanduser("~/Desktop/prob.png")
dest_file = os.path.expanduser("~/Desktop/processed_img.png")
img = Image.open(source_file)
# Convert all colors in the palette to grayscale and save the new palette
pal = img.getpalette()
for i in range(len(pal) // 3):
# Using ITU-R 601-2 luma transform
g = (pal[3*i] * 299 + pal[3*i+1] * 587 + pal[3*i+2] * 114) // 1000
pal[3*i: 3*i+3] = [g, g, g]
img.putpalette(pal)
try:
img.save(dest_file, optimize=True, format="PNG")
except IOError:
ImageFile.MAXBLOCK = img.size[0] …Run Code Online (Sandbox Code Playgroud) 我正在制作一个应用程序,从相机拍摄图像,然后通过电子邮件发送.
朋友,因为你知道来自相机的图像可能具有太多的分辨率和大小,例如2.0MB甚至更多,所以我想要的是重新调整图像的大小和分辨率,以便我可以将该文件附加到电子邮件.
所以任何人都可以给我一些代码示例或一些指导来解决我的问题.
提前致谢
例如,我生成了一些高分辨率的出版质量图
library(plot3D)
Volcano<-volcano
zf=10 #zoom factor
tiff("Volcano.tif", width=1800*zf, height=900*zf, res=175*zf, compression="lzw")
image2D(z = Volcano, clab = "height, m",colkey = list(dist = -0.20, shift = 0.15,side = 3, length = 0.5, width = 0.5,cex.clab = 1.2, col.clab = "white", line.clab = 2,col.axis = "white", col.ticks = "white", cex.axis = 0.8))
dev.off()
Run Code Online (Sandbox Code Playgroud)
该文件是22 MB.
现在我用GIMP打开文件而不做任何其他事情我将它导出为"Volcano gimp.tif"(不要改变分辨率,或做任何其他事情).GIMP生成一个1.9 MB的文件("Volcano gimp.tif").
imagemagick 报告相似图片统计:
$ identify Volcano.tif
Volcano.tif TIFF 18000x9000 18000x9000+0+0 8-bit DirectClass 22.37MB 0.000u 0:00.000
$ identify "Volcano gimp.tif"
Volcano gimp.tif TIFF 18000x9000 …Run Code Online (Sandbox Code Playgroud) 我想将 .jpg 或 .png 文件转换为 .webp。不幸的是镜像包只支持webp读取而不支持写入。
一种解决方案是将linux二进制文件添加到flutter(cwebp)中,但如何顺利执行?我检查了一下,发现这个问题是一年多前提出的,但仍然没有答案
我愿意接受任何建议,最终目标并不是格式本身,而是手机分辨率整体良好质量的最低文件大小。
当我尝试压缩jpg图像时,大多数情况下它完美地工作,但是一些jpg图像在压缩后变为绿色.这是我的代码
public void compressImage(String filename, String fileExtension) {
BufferedImage img = null;
try {
File file = new File(filename);
img = ImageIO.read(file);
if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
//Since there might be transparent pixel, if I dont do this,
//the image will be all black.
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int rgb = img.getRGB(x, y);
int alpha = (rgb >> 24) & 0xff;
if (alpha != …Run Code Online (Sandbox Code Playgroud)