如何下载并保存动画webp的位图?
How to download and save Bitmap of animated webp?
当我将 webp 文件用于动画贴纸包时,它会被拒绝,但如果将相同的文件用于静态贴纸包,则会被排除。查看所有代码后,我才知道这是这些文件出现问题的最后一点。但不知道如何识别 webp 文件在保存后是否保持为动画 webp。请分享您的想法。
ps:我将这些 webp 文件用于 whatsapp 贴纸包。有标志“animated_sticker_pack”。我们必须告诉 whatsapp 这个包只包含具有适当格式的动画 webp。如果我将其设置为 false,则会添加贴纸包(让它成为静态或动画 webp)。但是,如果我将该标志设置为 true,那么那些动画 webp 将因包显示错误而被拒绝 此包有问题...。因此,帧可能比所需的要少。它被接受为静态意味着它可能只有单帧。
为了避免有关文件类型、格式、大小等问题,我使用的是 WhatsApp 示例应用程序中的示例文件
代码:
public static void SaveImage(Bitmap finalBitmap, String name, String identifier) {
String root = path + "/" + identifier;
File myDir = new File(root);
myDir.mkdirs();
String fname = name;
File file = new File(myDir, fname);
if (file.exists()){
file.delete();
}
try {
// FileOutputStream
FileOutputStream out = new FileOutputStream(file);
// Bitmap.compress
finalBitmap.compress(Bitmap.CompressFormat.WEBP, 100, out);
// close
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
////////////////////Other methods before saving images
private Bitmap downloadImageBitmap(String sUrl, String sIdentifier, String sName) {
imageFileName = getLastBitFromUrl(sUrl).replace(".png", ".webp");
identifier = sIdentifier;
name = sName;
Bitmap bitmap = null;
try {
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
bitmap = BitmapFactory.decodeStream(inputStream); // Decode Bitmap
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected Bitmap doInBackground(String... params) {
return downloadImageBitmap(params[0], params[1], params[2]);
}
protected void onPostExecute(Bitmap result) {
SaveImage(result, imageFileName, identifier);
}
可以在doInBackground()中下载保存
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
FileOutputStream out = new FileOutputStream(file);
然后创建一个循环,从输入流中读取缓冲区中的字节并写入输出流。
完成后不要忘记关闭所有流。
当我将 webp 文件用于动画贴纸包时,它会被拒绝,但如果将相同的文件用于静态贴纸包,则会被排除。查看所有代码后,我才知道这是这些文件出现问题的最后一点。但不知道如何识别 webp 文件在保存后是否保持为动画 webp。请分享您的想法。
ps:我将这些 webp 文件用于 whatsapp 贴纸包。有标志“animated_sticker_pack”。我们必须告诉 whatsapp 这个包只包含具有适当格式的动画 webp。如果我将其设置为 false,则会添加贴纸包(让它成为静态或动画 webp)。但是,如果我将该标志设置为 true,那么那些动画 webp 将因包显示错误而被拒绝 此包有问题...。因此,帧可能比所需的要少。它被接受为静态意味着它可能只有单帧。 为了避免有关文件类型、格式、大小等问题,我使用的是 WhatsApp 示例应用程序中的示例文件
代码:
public static void SaveImage(Bitmap finalBitmap, String name, String identifier) {
String root = path + "/" + identifier;
File myDir = new File(root);
myDir.mkdirs();
String fname = name;
File file = new File(myDir, fname);
if (file.exists()){
file.delete();
}
try {
// FileOutputStream
FileOutputStream out = new FileOutputStream(file);
// Bitmap.compress
finalBitmap.compress(Bitmap.CompressFormat.WEBP, 100, out);
// close
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
////////////////////Other methods before saving images
private Bitmap downloadImageBitmap(String sUrl, String sIdentifier, String sName) {
imageFileName = getLastBitFromUrl(sUrl).replace(".png", ".webp");
identifier = sIdentifier;
name = sName;
Bitmap bitmap = null;
try {
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
bitmap = BitmapFactory.decodeStream(inputStream); // Decode Bitmap
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected Bitmap doInBackground(String... params) {
return downloadImageBitmap(params[0], params[1], params[2]);
}
protected void onPostExecute(Bitmap result) {
SaveImage(result, imageFileName, identifier);
}
可以在doInBackground()中下载保存
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
FileOutputStream out = new FileOutputStream(file);
然后创建一个循环,从输入流中读取缓冲区中的字节并写入输出流。
完成后不要忘记关闭所有流。