我知道并且我偏执地认为这会被标记为 DUPLICATE
但是我遇到了一些我无法解决的问题,所以我需要你的帮助。
基本上我抽象了从图像(任何)读取前 8 个字节的概念,并根据它决定它是否属于任何类型(PNG、JPEG、GIF)。
我正尝试在 Java 中实现这一目标。
package examples;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
import org.apache.commons.io.IOUtils;
public class BlobCheck
{
public static void main(String args[]) throws Exception
{
File dir = new File(args[0]);
File files[] = dir.listFiles();// Here this files will be changed to
// Blobs from database and then i will
// convert each blob to bytes.
StringBuffer sb = new StringBuffer();
StringBuilder chars = new StringBuilder();
File afile[];
int j = (afile = files).length;
for (int i = 0; i < j; i++)
{
File file = afile[i];
FileInputStream fis = new FileInputStream(file);
byte bytearr[] = IOUtils.toByteArray(fis);
long count = 0L;
byte abyte0[];
int l = (abyte0 = bytearr).length;
for (int k = 0; k < l; k++)
{
byte b = abyte0[k];
if (count == 8L)
break;
sb.append(b);
chars.append((char) b);
count++;
}
// if ("-1-40-1-320167470".equals(sb.toString()))
/*
* if ("-1-40-1".equals(sb.toString())) System.out.println((new
* StringBuilder
* (String.valueOf(file.getName()))).append(" is an image file ")
* .append
* (sb.toString()).append(" ").append(chars.toString()).toString());
* else
*/
System.out.println((new StringBuilder(String.valueOf(file.getName()))).append(" ").append(sb.toString()));
sb.delete(0, sb.length());
chars.delete(0, chars.length());
}
}
}
现在,我用一堆不同类型的文件(图像、文档、xls 等)填充一个文件夹并执行我得到以下输出的类。
在这里,前 8 个字节(十进制)值与 DUPLICATE(上面)中给出的值不同。令人惊讶的是,大多数图像都具有相同的 8 个字节,只有少数没有(突出显示)。
输出:
- 2.jpg -1-40-1-320167470
- 2g.gif -1-40-1-320167470
- 324.png -1-40-1-320167470
- 4.jpg -1-40-1-320167470
- 6.jpg -1-40-1-320167470
- 9.jpg -1-40-1-320167470
- Logo.jpg -1-40-1-1801465100
- lpng.png -1-40-1-1801465100
- 图片.xls -48-4917-32-95-7926-31
- Thumbs.db -48-4917-32-95-7926-31
如果我哪里出错了请告诉我!谢谢。
最佳答案
我发现了问题。谢谢gyan 我已经觉得自己很愚蠢了。 我需要做的就是更改以检查字节的十六进制代码而不是小数。 正如 http://www.garykessler.net/library/file_sigs.html 中给出的那样
解决方法很简单—— sb.append(String.format("%02X ", b));
for (int k = 0; k < l; k++)
{
byte b = abyte0[k];
if (count == 8L)
break;
//System.out.println(file.getName()+" "+b);
//sb.append(b);
sb.append(String.format("%02X ", b));
//System.out.printf("0x%x ", b);
count++;
}
然后测试如下
if(sb.toString().startsWith("FF D8 FF"))
System.out.println(file.getName() +" is JPG ");
else if(sb.toString().startsWith("47 49 46 38 37 61") || sb.toString().startsWith("47 49 46 38 39 61"))
System.out.println(file.getName() +" is GIF ");
else if(sb.toString().startsWith("89 50 4E 47 0D 0A 1A 0A"))
System.out.println(file.getName() +" is PNG ");
输出:
- 2.jpg为JPG
- 2g.gif 是 JPG//从 JPG 类型更改为 GIF。
- 324.png 为 JPG
- 4.jpg 为JPG
- 6.jpg 为JPG
- 9.jpg 为JPG
- add1.JPG为JPG
- Logo.jpg 为 JPG
- Lpng.png 是 JPG//类型从 JPG 更改为 PNG。
- realGIF.gif 是 GIF
- realPNG.png 是 PNG
关于java - 确定 blob 在 java 中是否有图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18759351/