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

发布于 2022-09-07 12:24:11 字数 2958 浏览 19 评论 0

1.在做图像处理的时候遇到了一个非常非常诡异的问题:这是那张困扰我好久的图片:
图片描述

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ぺ禁宫浮华殁 2022-09-14 12:24:12

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文