我有几个 javascript 库(Angular-ahdin、JIC),我可以用它们来压缩用户上传的图像,然后再将其提交到后端。
我见过的所有库都采用质量参数并使用 jpeg 压缩来缩小文件。在压缩之前,基于任何质量值,您不知道生成的图像的文件大小是多少。
我的想法是使用“二分搜索”类型的算法来尝试不同的质量百分比,直到我最终获得刚好低于目标最大文件大小的图像。
将以 50% jpeg 质量开始。如果压缩图像低于目标文件大小,则采用 75% 质量,否则采用 25% 质量,依此类推。它会在保证的 6 次迭代内将目标文件大小达到 1% 的粒度,然后我会停止。
假设没有一个库已经具有此功能,是否有比二分搜索更好的方法?是否有任何图像研究表明种子价值高于 50%?
我正在尝试压缩用相机拍摄的照片而不缩放图像尺寸。
我尝试了 bitmap.compress,但没有成功。只是为了确保我尝试压缩从资源加载的位图,但仍然没有成功。
有任何想法吗?
示例代码:
//load bitmap from resources:
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.trolltunga);
Log.d("roee", "onImageCaptured: before compress = " + bitmap.getByteCount() + ", " + bitmap.getWidth() + ", " + bitmap.getHeight());
//compressing
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);
Bitmap comp = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray()));
Log.d("roee", "onImageCaptured: after compress = " + comp.getByteCount() + ", " + comp.getWidth() + ", " + comp.getHeight());
Run Code Online (Sandbox Code Playgroud)
记录结果:
D/roee: onImageCaptured: before compress = 10800000, 3000, 900
D/roee: onImageCaptured: after compress = 10800000, 3000, 900
Run Code Online (Sandbox Code Playgroud) 这是有问题的文件:
如果您在十六进制编辑器中打开此 PNG 图像,您会发现该文件只有 777 字节大。这怎么可能?请注意,每个像素都有不同的颜色值!
具有唯一像素的 24 位 256x256 图像应至少为 197KB。
256*256*3 字节 = 196608 字节
这是使用 PNG 文件的某些隐藏功能还是使用某种 hack?
编辑:作为完整性检查,我将 PNG 编码为 Base64,果然,它是一样小。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAABIAAAASABGyWs+AAACu0lEQVR42u3TAQkAMBDEsHuYf80T0oRa6G07qdrbDbIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYA0A5BmANIMQJoBSDMAaQYgzQCkGYC0DxplBfxP7XIvAAAAAElFTkSuQmCC
Run Code Online (Sandbox Code Playgroud) 我收到错误“CUDA 内存不足”,然后我将 torch.no_grad() 函数添加到我的代码中。这会影响我的准确性吗?
for iters in range(args.iterations):
with torch.no_grad():
encoded, encoder_h_1, encoder_h_2, encoder_h_3 = encoder(
res, encoder_h_1, encoder_h_2, encoder_h_3)
with torch.no_grad():
code = binarizer(encoded)
with torch.no_grad():
output, decoder_h_1, decoder_h_2, decoder_h_3, decoder_h_4 = decoder(
code, decoder_h_1, decoder_h_2, decoder_h_3, decoder_h_4)
res = res - output.detach()
codes.append(code.data.cpu().numpy())
torch.cuda.empty_cache()
print('Iter: {:02d}; Loss: {:.06f}'.format(iters, res.data.abs().mean()))
Run Code Online (Sandbox Code Playgroud) 通过运行ffmpeg -h encoder=apng,我得到了这个:
APNG encoder AVOptions:
-dpi <int> E..V..... Set image resolution (in dots per inch) (from 0 to 65536) (default 0)
-dpm <int> E..V..... Set image resolution (in dots per meter) (from 0 to 65536) (default 0)
-pred <int> E..V..... Prediction method (from 0 to 5) (default none)
none E..V.....
sub E..V.....
up E..V.....
avg E..V.....
paeth E..V.....
mixed E..V.....
Run Code Online (Sandbox Code Playgroud)
这些用 指定的预测方法有什么区别-pred?
我在 ffmpeg.org 或其他地方找不到任何文档。
我有二进制码为10111,100011,11101111等.现在是什么数据结构我应该用它来存储这些代码,从而最小尺寸需要存储它们?
我不能使用字符串数组,因为所需的大小将比存储上述二进制代码的十进制等效项更多.
我需要单独保存视频帧并无损压缩它们.我正在寻找c#中最好的方法和格式 - 最好的意思是实现简单性,良好压缩和合理处理要求的最佳平衡.
我知道PNG是无损的,但它的压缩对于照片风格的图像并不是很好.
我知道有一种无损Jpeg格式,但这是用C#实现的吗?
还有其他我不知道的选择吗?
为了防止我的应用程序滞后,我正在尝试压缩大于1 MB的图像(主要用于从iphone普通相机拍摄的照片).
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
NSData *imageSize = UIImageJPEGRepresentation(image, 1);
NSLog(@"original size %u", [imageSize length]);
UIImage *image2 = [UIImage imageWithData:UIImageJPEGRepresentation(image, 0)];
NSData *newImageSize = UIImageJPEGRepresentation(image2, 1);
NSLog(@"new size %u", [newImageSize length]);
UIImage *image3 = [UIImage imageWithData:UIImageJPEGRepresentation(image2, 0)];
NSData *newImageSize2 = UIImageJPEGRepresentation(image3, 1);
NSLog(@"new size %u", [newImageSize2 length]);
picView = [[UIImageView alloc] initWithImage:image3] ;
Run Code Online (Sandbox Code Playgroud)
然而,NSLog我得到了一些东西
original size 3649058
new size 1835251
new size 1834884
Run Code Online (Sandbox Code Playgroud)
第一次和第二次压缩之间的差异几乎可以忽略不计.我的目标是使图像大小低于1 MB.我是否忽视了某些事情/有没有其他方法来实现这一目标?
编辑:如果可能的话,我想避免缩放图像的高度和宽度.
objective-c uiimagepickercontroller uiimage image-compression ios
Bitmap clip = new Bitmap((int)(8.5 * 72), (int)(11 * 72));
MemoryStream stream = new MemoryStream();
clip.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
byte[] bytes = stream.ToArray();
Run Code Online (Sandbox Code Playgroud)
我跑了它在我的机器上,并且bytes.Length是8587,我的同事开发的机器是2009.据说,.NET没有办法影响PNG压缩的质量(或者说这种情况下的比率).这个特殊的图像是空白的,我还有其他测试与内容图像一起工作,他们确认压缩是无损的(我遇到了一些争论,这是一个问题).
但即使压缩是无损的,压缩算法运行时间+ CPU利用率与压缩率/质量之间也需要权衡.我想知道如何System.Drawing.Imaging确定质量,因为上述情况清楚地表明可能存在差异.我怎么能确定在客户的机器上它不会选择100%的质量(这将产生1.457.337大小的文件)?
相关材料:
附加信息:
我正在研究用户可以上传图片的内容(图片大小不受限制).现在我有两种选择:使用PHP压缩图像(服务器端)或使用JavaScript压缩客户端计算机上的图像,然后将其上载到服务器.我想问一下哪两种方法更好实施?服务器上的压缩可能会导致服务器负载过重,所以我想到客户端压缩,但是如果我上传更大尺寸的图像(假设大约12MB左右),那么由于脚本,浏览器会冻结一段时间.
因此,没有代码只是一个理论问题.目前我正在使用 JIC进行客户端压缩
用于客户端图像压缩的任何其他好的库?哪种方法会更好?任何帮助将非常感激.