开发者社区> 问答> 正文

什么样的手段处理图片后会使得用java取得该图片的RGB值与实际值不同?报错

"

1.在做图像处理的时候遇到了一个非常非常诡异的问题:这是那张困扰我好久的图片:
<span class=""img-wrap""><img referrerpolicy=""no-referrer"" data-src=""/img/bVbcjbe?w=1200&h=430"" src=""https://cdn.segmentfault.com/v-5e8d8dec/global/img/squares.svg"" alt=""图片描述"" title=""图片描述"" />

这是天猫营业执照的标准格式,我上传的图片和原图片的背景有些区别。如果哪个大神有兴趣深究的话随便打开某个天猫店铺在最上面就能打开他的营业执照信息,就能查看图片。
这张图片的诡异之处在于,我在提取他的RGB值的时候发现用java的方法取得的RGB值和第一和我用ps取得的RGB值不同,第二和我肉眼看到的也不同,比如我用java取左上角x从0到10,y从0到10一百个像素点的RGB值,


(0,0,0)不应该是黑色吗!我不管用肉眼看还是ps打开都不应该是黑色啊!!这是怎么回事啊!
以下附我java的代码:`
package lee;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class getrgb {

/** 
 * 读取一张图片的RGB值 
 *  
 * @throws Exception 
 */  
public void getImagePixel(String image) throws Exception {  
    int[] rgb = new int[3];  
    File file = new File(image);  
    BufferedImage bi = null;  
    try {  
        bi = ImageIO.read(file);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    int width = bi.getWidth();  
    int height = bi.getHeight();  
    int minx = bi.getMinX();  
    int miny = bi.getMinY();  
    System.out.println("width=" + width + ",height=" + height + ".");  
    System.out.println("minx=" + minx + ",miniy=" + miny + ".");  
    for (int i = 0; i < 10; i++) {  
        for (int j =0; j < 10; j++) {  
            int pixel = bi.getRGB(i, j); // 下面三行代码将一个数字转换为RGB数字  
            rgb[0] = (pixel & 0xff0000) >> 16;  
            rgb[1] = (pixel & 0xff00) >> 8;  
            rgb[2] = (pixel & 0xff);  
            System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + ","  
                    + rgb[1] + "," + rgb[2] + ")");  
        }  
    }  
}  

/** 
 * 返回屏幕色彩值 
 *  
 * @param x 
 * @param y 
 * @return 
 * @throws AWTException 
 */  
public int getScreenPixel(int x, int y) throws AWTException { // 函数返回值为颜色的RGB值。  
    Robot rb = null; // java.awt.image包中的类,可以用来抓取屏幕,即截屏。  
    rb = new Robot();  
    Toolkit tk = Toolkit.getDefaultToolkit(); // 获取缺省工具包  
    Dimension di = tk.getScreenSize(); // 屏幕尺寸规格  
    System.out.println(di.width);  
    System.out.println(di.height);  
    Rectangle rec = new Rectangle(0, 0, di.width, di.height);  
    BufferedImage bi = rb.createScreenCapture(rec);  
    int pixelColor = bi.getRGB(x, y);  

    return 16777216 + pixelColor; // pixelColor的值为负,经过实践得出:加上颜色最大值就是实际颜色值。  
}  

/** 
 * @param args 
 */  
public static void main(String[] args) throws Exception {  
    int x = 0;  
    getrgb rc = new getrgb();  
    x = rc.getScreenPixel(100, 345);  
    System.out.println(x + " - ");  
    rc.getImagePixel("C:\\Users\\Administrator\\pythonprogram\\picture\\1.png");  
}  

}
`ps:这张图片还有一个很诡异的问题,如果把图片下载到手机上打开,整张图片会变成全黑的,然后只有天猫营业执照专属什么的几个字。。。我怀疑是天猫为了防止人机器识别对图片做了什么处理。。。

"

展开
收起
因为相信,所以看见。 2020-05-27 12:59:32 1072 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

    "

    那应该不是黑色,可能是透明,你可以通过

    int alpha = (pixel & 0xFF000000) >>> 24;

    把透明度也提取出来看看。

    "
    2020-05-27 16:23:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载