2011-04-20 99 views
1

我有一個有符號的值,例如-7368817 當我投它以字節這將是這樣的:-113 我將它轉換爲無符號字節再見& 0xff,它將會像現在 我操縱這個字節值和我後想整個迴歸!得到新字節的有符號整數。 :)signed int to unsigned byte,反之亦然

更新

原委:

我有一個形象,這是8位的深度和灰度!這意味着所有像素使用1個字節

BufferedImage image = ImageIO.read(new File("my_grayscal_8bit_photo.jpg")); 

int intPixel = image.getRGB(1, 1); 

現在提出我需要一些位操作在這個像素,但因爲它是INT我必須將它先字節:

byte bytePixel = (byte) intPixel; 

,並使其簽名:

int intPixel2 = bytePixel & 0xff; 

現在我做我的位操作,並希望將其轉換爲int,做:

image.setRGB(1, 1, neworiginalint); 
+3

我假設你知道java沒有無符號類型(除char之外) – Bozho 2011-04-20 08:02:26

+0

而且一個字節只能保存256個值,即8位的2^8。恕我直言,你可以使用字節作爲無符號,如果你想,你只是不會從Java獲得很多幫助。 – 2011-04-20 08:06:14

+0

順便說一句:如果你可以將每個可能的值放入一個1字節的'byte'中,那麼有一個4字節的'int'會是什麼意思;) – 2011-04-20 08:10:00

回答

4

getRGB(int x, int y)方法總是返回在TYPE_INT_ARGB顏色模型int像素。要手動提取紅色,綠色,藍色和alpha值,你可以做到這一點的像素:

int pixel = image.getRGB(1, 1); 
int a = (pixel >> 24) & 0xFF; 
int r = (pixel >> 16) & 0xFF; 
int g = (pixel >> 8) & 0xFF; 
int b = pixel & 0xFF; 

或者使用Color(int rgba, boolean hasalpha)構造爲方便起見(以性能爲代價)。一旦你操縱的紅色,綠色,藍色和alpha值(在0到255的範圍),你可以重組它們放回一個int設置像素:

int newPixel = (a << 24) | (r << 16) | (g << 8) | b; 

使用你所提到的-7368817像素這個代碼,alpha是255(所以不透明),紅色,綠色和藍色的值都是143.因爲你處理的是灰度,你可以選擇紅色,綠色或藍色來獲取灰度值。然而,在設置像素時,您將設置所有三個像素以保持灰度,因爲它是RGB。你可以快捷有點像這樣:

int pixel = image.getRGB(1, 1); 

// extract your gray value from blue, assume red and green are same 
int gray = pixel & 0xFF; 

// this method does your manipulation on the gray value, 0 to 255 
gray = manipulate(gray); 

// recombine back into int, preserving the original alpha 
int newPixel = (pixel & 0xFF000000) | (gray << 16) | (gray << 8) | gray; 

// now you can set your new pixel 
image.setRGB(1, 1, nexPixel); 

基本上訣竅是使用int爲你的無符號字節。只要確保你保持從0到255的值,一切都應該正常工作。

1

你問的是如何處理有符號整數中最不重要的字節,而不接觸更重要的字節?
這是可以做到這樣的:

int i = -7368817; // 0xFF8F 8F8F 
int b = i & 0xFF; // "signed byte", = 0x8F = 143 
b += 0x2C; // your manipulation, result = 0xBB 
i = (i & 0xFFFFFF00) | (b & 0xFF); // result of LSB modification = 0xFF8F8FBB 

或一步到位:i = (i & 0xFFFFFF00) | ((i + 0x2C) & 0xFF);,如果它是一個簡單的操作。

如果操作永遠不能產生溢出,你可以簡單地做對整個INT:
i ^= 0x34; // i = 0xFF8F8FBB