整数颜色color.getRGB得到是负数,解决方案

本文探讨了Java中获取颜色RGB值的过程,并提供了如何从整数转换为颜色的方法。此外,分享了一些程序员的幽默诗,增加阅读趣味。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

    情景:ava.awt.color 下面的getRGB怎么得出的是负数???本来想通过getRGB得到一个整数,在另外的一个部分在根据这个整数构件一个color,因为参数划定只能能传整数!!!color通过什么方法得到一整数????

     

    每日一道理
爱心是一片照射在冬日的阳光,使贫病交迫的人感到人间的温暖;爱心是一泓出现在沙漠里的泉水,使濒临绝境的人重新看到生活的希望;爱心是一首飘荡在夜空的歌谣,使孤苦无依的人获得心灵的慰藉。

    解决方案:getRGB()返回默许 sRGB ColorModel 中表现颜色的 RGB 值。(24-31 位表现 alpha,16-23 位表现红色,8-15 位表现绿色,0-7 位表现蓝色)。

要得到详细R,G,B颜色分量得做个位移
// Color color
int rgb = color.getRGB();
int r = (rgb & 16711680) >> 16;
int g = (rgb & 65280) >> 8;
int b = (rgb & 255);

也可以直接应用Color的getRed(),getGreen(),getBlue()方法得到r,g,b.

 

文章结束给大家分享下程序员的一些笑话语录: 程序员打油诗   
  写字楼里写字间,写字间里程序员;
  程序人员写程序,又拿程序换酒钱。
  酒醒只在网上坐,酒醉还来网下眠;
  酒醉酒醒日复日,网上网下年复年。
  但愿老死电脑间,不愿鞠躬老板前;
  奔驰宝马贵者趣,公交自行程序员。
  别人笑我忒疯癫,我笑自己命太贱;
  不见满街漂亮妹,哪个归得程序员。

@PostConstruct public void initOcrEngine() { tesseract = new Tesseract(); //语言包路径和支持语言 tesseract.setDatapath(tessDataPath); tesseract.setLanguage("eng+chi_sim"); tesseract.setPageSegMode(6); //自动页面分割 tesseract.setOcrEngineMode(3); //LSTM引擎 // 设置白名单字符 tesseract.setVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/()-. ,#|:/@_"); } /** * OCR识别图片内容 */ private String extractImageText(MultipartFile file) { try (InputStream is = file.getInputStream()) { BufferedImage image = ImageIO.read(is); if (image == null) { return MessageUtils.message("Image.parsing.failed"); } image = preprocessImage(image); image = increaseVerticalSpacing(image,10); image = increaseHorizontalSpacing(image,10); // BufferedImage bufferedImage = preprocessImage(image); // String result = tesseract.doOCR(bufferedImage); String result = tesseract.doOCR(image); //OCR识别 result = postProcess(result); result = result.replaceAll("\\s+", " ").trim(); System.out.println("图片内容:\n" + result); return result; } catch (Exception e) { e.printStackTrace(); return MessageUtils.message("file.read.picture.error"); } } public static BufferedImage preprocessImage(BufferedImage image) { // 转换为灰度图像 BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics2D g2d = grayImage.createGraphics(); g2d.drawImage(image, 0, 0, null); g2d.dispose(); // 二值化处理 for (int y = 0; y < grayImage.getHeight(); y++) { for (int x = 0; x < grayImage.getWidth(); x++) { int rgb = grayImage.getRGB(x, y); int gray = (rgb & 0xff); if (gray < 128) { grayImage.setRGB(x, y, Color.BLACK.getRGB()); } else { grayImage.setRGB(x, y, Color.WHITE.getRGB()); } } } // 简单的降噪处理(去除孤立的像素点) for (int y = 1; y < grayImage.getHeight() - 1; y++) { for (int x = 1; x < grayImage.getWidth() - 1; x++) { int count = 0; if (grayImage.getRGB(x - 1, y - 1) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x, y - 1) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x + 1, y - 1) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x - 1, y) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x + 1, y) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x - 1, y + 1) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x, y + 1) == Color.BLACK.getRGB()) count++; if (grayImage.getRGB(x + 1, y + 1) == Color.BLACK.getRGB()) count++; if (count < 2) { grayImage.setRGB(x, y, Color.WHITE.getRGB()); } } } return grayImage; } public static BufferedImage increaseVerticalSpacing(BufferedImage image, int spacing) { int width = image.getWidth(); int height = image.getHeight(); // 转换为灰度图像类型 BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); Graphics2D g2d = grayImage.createGraphics(); g2d.drawImage(image, 0, 0, null); g2d.dispose(); // 创建一个的BufferedImage对象,高度增加上下间距 BufferedImage newImage = new BufferedImage(width, height + spacing * 2, BufferedImage.TYPE_BYTE_GRAY); Graphics2D newG2d = newImage.createGraphics(); // 在新图像上绘制原始图像,并在上下留出间距 newG2d.drawImage(grayImage, 0, spacing, null); newG2d.dispose(); return newImage; } public static BufferedImage increaseHorizontalSpacing(BufferedImage image, int spacing) { int width = image.getWidth(); int height = image.getHeight(); // 转换为灰度图像类型 BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); Graphics2D g2d = grayImage.createGraphics(); g2d.drawImage(image, 0, 0, null); g2d.dispose(); // 创建一个新的BufferedImage对象,宽度增加左右间距 BufferedImage newImage = new BufferedImage(width + spacing * 2, height, BufferedImage.TYPE_BYTE_GRAY); Graphics2D newG2d = newImage.createGraphics(); // 在新图像上绘制原始图像,并在左右留出间距 newG2d.drawImage(grayImage, spacing, 0, null); newG2d.dispose(); return newImage; } 用起来跟没有一样啊 读取的效果
07-25
@PostConstruct public void initOcrEngine() { tesseract = new Tesseract(); //语言包路径和支持语言 tesseract.setDatapath(tessDataPath); tesseract.setLanguage("eng+chi_sim"); tesseract.setPageSegMode(6); //自动页面分割 tesseract.setOcrEngineMode(3); //LSTM引擎 } /** * OCR识别图片内容 */ private String extractImageText(MultipartFile file) { try (InputStream is = file.getInputStream()) { BufferedImage image = ImageIO.read(is); if (image == null) { return MessageUtils.message("Image.parsing.failed"); } image = binarizeImage(image, 128); // 二值化 image = breakCharacterConnections(image); // 断开粘连 List<Rectangle> regions = findCharacterRegions(image); // 字符级检测 image = addSpacingBetweenCharacters(image, regions, 10); // 插入间距 saveDebugImage(image, "3_final.png"); // 保存最终处理结果 String result = tesseract.doOCR(image); //OCR识别 result = postProcess(result); result = result.replaceAll("\\s+", " ").trim(); System.out.println("图片内容:\n" + result); return result; } catch (Exception e) { e.printStackTrace(); return MessageUtils.message("file.read.picture.error"); } } private void saveDebugImage(BufferedImage img, String filename) throws IOException { // 保存到项目目录下的debug文件夹 String basePath = "D:/pdf/debug/"; File outputDir = new File(basePath); if (!outputDir.exists()) outputDir.mkdirs(); String fullPath = basePath + filename; ImageIO.write(img, "png", new File(fullPath)); } private static BufferedImage binarizeImage(BufferedImage image, int threshold) { int width = image.getWidth(); int height = image.getHeight(); BufferedImage binaryImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int argb = image.getRGB(x, y); int gray = (argb >> 16) & 0xff; if (gray < threshold) { binaryImage.setRGB(x, y, Color.BLACK.getRGB()); } else { binaryImage.setRGB(x, y, Color.WHITE.getRGB()); } } } return binaryImage; } public static List<Rectangle> findCharacterRegions(BufferedImage binaryImage) { int width = binaryImage.getWidth(); int height = binaryImage.getHeight(); boolean[][] visited = new boolean[width][height]; List<Rectangle> regions = new ArrayList<>(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (isBlack(binaryImage.getRGB(x, y)) && !visited[x][y]) { // BFS查找连通域 Queue<Point> queue = new LinkedList<>(); queue.add(new Point(x, y)); visited[x][y] = true; int minX = x, maxX = x, minY = y, maxY = y; while (!queue.isEmpty()) { Point p = queue.poll(); for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { int nx = p.x + dx, ny = p.y + dy; if (nx >= 0 && nx < width && ny >= 0 && ny < height && isBlack(binaryImage.getRGB(nx, ny)) && !visited[nx][ny]) { visited[nx][ny] = true; queue.add(new Point(nx, ny)); minX = Math.min(minX, nx); maxX = Math.max(maxX, nx); minY = Math.min(minY, ny); maxY = Math.max(maxY, ny); } } } } // 过滤小面积噪点 if ((maxX - minX + 1) * (maxY - minY + 1) > 20) { regions.add(new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1)); } } } } return regions; } private static boolean isBlack(int rgb) { return (rgb & 0xFFFFFF) == 0; // 纯黑色 } public static BufferedImage addSpacingBetweenCharacters(BufferedImage image, List<Rectangle> regions, int spacing) { int width = image.getWidth(); int height = image.getHeight(); BufferedImage newImage = new BufferedImage(width + spacing * regions.size(), height, BufferedImage.TYPE_BYTE_BINARY); Graphics2D g = newImage.createGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, newImage.getWidth(), newImage.getHeight()); int offsetX = 0; for (Rectangle r : regions) { // 截取字符区域 BufferedImage charImg = image.getSubimage(r.x, r.y, r.width, r.height); g.drawImage(charImg, offsetX, 0, null); offsetX += r.width + spacing; // 插入间距 } g.dispose(); return newImage; } public static BufferedImage breakCharacterConnections(BufferedImage image) { int width = image.getWidth(); int height = image.getHeight(); BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY); // 定义3x3结构元素 int[][] kernel = { {1, 1, 1}, {1, 1, 1}, {1, 1, 1} }; // 腐蚀(缩小边缘) BufferedImage eroded = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY); for (int y = 1; y < height - 1; y++) { for (int x = 1; x < width - 1; x++) { boolean allBlack = true; for (int dy = -1; dy <= 1; dy++) { for (int dx = -1; dx <= 1; dx++) { if ((image.getRGB(x + dx, y + dy) & 0xFF) > 0x7F) { allBlack = false; break; } } } eroded.setRGB(x, y, allBlack ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); } } // 膨胀(恢复字符主体) for (int y = 1; y < height - 1; y++) { for (int x = 1; x < width - 1; x++) { boolean anyBlack = false; for (int dy = -1; dy <= 1; dy++) { for (int dx = -1; dx <= 1; dx++) { if ((eroded.getRGB(x + dx, y + dy) & 0xFF) == 0) { anyBlack = true; break; } } } result.setRGB(x, y, anyBlack ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); } } return result; }对嘛
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值