簡體   English   中英

Java中兩個字節數組的絕對值相減

[英]Absolute Value Subtraction of Two byte arrays in Java

我正在嘗試對包含 2 個圖像的字節的兩個字節數組進行絕對值減法。 我知道整個字節減法情況有很多復雜性,因為字節的“-”運算符不存在。

有沒有辦法將兩個字節數組相減並將其存儲在另一個字節數組中?

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.lang.Math;

public class Subtraction {
     public static void main(String[] args) throws IOException {

            //Read Image to a byte array
            BufferedImage bImage = ImageIO.read(new File("ground.bmp"));
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(bImage, "bmp", bos );
            byte [] data = bos.toByteArray();
            System.out.println("ground: " + data);

            BufferedImage bImage2 = ImageIO.read(new File("back.bmp"));
            ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
            ImageIO.write(bImage2, "bmp", bos2 );
            byte [] data2 = bos2.toByteArray();
            System.out.println("Back: " + data2);

            byte [] data3 = (byte) (Math.abs(data2 - data)); // really wished this worked
            System.out.println("Subtracted Bytes: " + data3);

            ByteArrayInputStream j = new ByteArrayInputStream(data3);
            BufferedImage bImage3;
            bImage3 = ImageIO.read(j)
            ImageIO.write(bImage3, "bmp", new File("Subtracted.bmp"));
            System.out.println("image created");



     }
}

這是我得到的錯誤:

Type mismatch: cannot convert from byte to byte[]
    The operator - is undefined for the argument type(s) byte[], byte[]

我需要做的是根據字節減去兩個圖像並將其結果作為第三個圖像。

我怎樣才能用字節做到這一點?

您希望發表評論的那一行會起作用,一種選擇是按元素進行工作。

byte [] data3 = new byte[data.length];
for(int i = 0; i<data.length; i++){
    data3[i] = (byte)Math.abs(data2[i] - data[i]);
}

System.out.println("Subtracted Bytes: " + Arrays.toString(data3));

這將創建一個相同長度的新字節數組,然后通過執行減法分配每個元素。

還有一件事,如果您嘗試對圖像進行操作,則您正在操作的字節數組是位圖圖像的序列化版本。 它有標題,執行這個減法可能會毀掉它。 您可能希望通過緩沖圖像進行操作。

BufferedImage bImage3 = new BufferedImage(bImage.getWidth(), bImage.getHeight(), bImage.getType());
for(int i = 0; i<bImage.getWidth(); i++){
    for(int j = 0; j<bImage.getHeight(); j++){
        bImage3.setRGB(i, j, Math.abs(bImage2.getRGB(i,j) - bImage.getRGB(i,j)));
    }
}

這可以通過使用圖像操作或直接處理柵格來改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM