【问题标题】:determine if blob has an image in java确定 blob 在 java 中是否有图像
【发布时间】:2013-09-12 17:48:26
【问题描述】:

我知道并且我很偏执地认为这会被标记为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
  • picture.xls -48-4917-32-95-7926-31
  • Thumbs.db -48-4917-32-95-7926-31

如果我在某个地方出错了,请告诉我!谢谢。

【问题讨论】:

    标签: java image blob


    【解决方案1】:

    我发现了问题。谢谢吉安 我已经对自己感到很愚蠢。 我需要做的就是更改以检查字节的十六进制代码而不是小数。 正如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
    • Lo​​go.jpg 为 JPG
    • Lpng.png 是 JPG //类型从 JPG 更改为 PNG。
    • realGIF.gif 是 GIF
    • realPNG.png 是 PNG

    【讨论】:

      【解决方案2】:

      您可能对文件名的扩展名感到困惑吗?

      试试这个,只需将 *.png 的名称更改为 *.jpeg 并使用任何图像编辑器/查看器打开即可;它不应该抱怨格式不被识别。这可能是您获得相同 8 个字节的原因,即使扩展名不同。

      因为,我观察到许多程序不会抱怨更改图像文件扩展名,只要他们可以处理文件并在他们的窗口中显示。

      编辑:请使用以下代码并发布输出:

      import java.io.*;
      import java.net.*;
      
      public class ReadBytes {
          public static void main( String [] args ) throws IOException {
      
              URL url = new URL("http://your image url");
      
                  // Read the image ...
              InputStream inputStream      = url.openStream();
              ByteArrayOutputStream output = new ByteArrayOutputStream();
              byte [] buffer               = new byte[ 1024 ];
      
              int n = 0;
              while (-1 != (n = inputStream.read(buffer))) {
                 output.write(buffer, 0, n);
              }
              inputStream.close();
      
              // Here's the content of the image...
              byte [] data = output.toByteArray();
      
          // Write it to a file just to compare...
          OutputStream out = new FileOutputStream("data.png");
          out.write( data );
          out.close();
      
          // Print it to stdout 
              for( byte b : data ) {
                  System.out.printf("0x%x ", b);
              }
          }
      }
      

      【讨论】:

      • 感谢 gyan 的快速回复。在这里,我试图理解两件事,首先是链接副本有一些链接,根据 PNG、JPEG、GIF 的说法,第一个字节应该总是在他们的网站上给出。但是,我看到的价值观与他们完全不同。其次,这种将 blob 判断为图像的方法是否可靠?或者你有什么想法吗?编辑:我知道更改文件类型会产生相同的结果。但是就像我说的那样,我对给出的不同值(至少对于 JPG)感到困惑。谢谢。
      • 请使用更新后的代码重新计算您的字节值并查看输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2016-06-13
      • 2023-03-09
      • 2012-08-25
      • 2023-03-26
      • 2013-01-12
      • 2014-12-05
      相关资源
      最近更新 更多