java - 确定 blob 在 java 中是否有图像

标签 java image blob

我知道并且我偏执地认为这会被标记为 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/

相关文章:

用于查找和覆盖/替换图像部分的 Python、OpenCV

database - Yii2 显示存储在 BLOB 数据库字段中的图像

mysql - ServiceStack.OrmLite : Implementing custom StringConverter affects column type of complex BLOB fields

java - nextLine() 无法正常工作..(Java)

java - 在 Java 中使用泛型方法参数

Java 内存使用量持续增长直到出现 OutOfMemory 异常

java - 在Java中读取图像文件

image - 如何使用 apache poi 在 Excel 中集中对齐图像

php - 如何将 longblob 数据转换为 varchar?

java - 居中按钮和 textView