全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1617
推到 Plurk!
推到 Facebook!

像素RGB分離後如何還原?

尚未結案
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-21 11:55:04 IP:118.160.xxx.xxx 訂閱
我先用以下方法將RGB分離:
for(int y=0;y<=511;y ){
for(int x=0;x<=511;x ){
b[x][y]=((a[x][y])>>16);
}
}
原始值為10658466(16進制) 轉為十進制162162162 分離後為162
可是之後我想再將他還原回去,用相同的方法得到的值卻不一樣
for(int y=0;y<=511;y ){
for(int x=0;x<=511;x ){
b[x][y]=((a[x][y])<<16);
}
}
所得到的值卻為 -1566441472
麻煩請各位大大及高手們幫忙解答,謝謝!!
------
jason
taishyang
站務副站長


發表:377
回覆:5487
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-22 11:47:08 IP:118.169.xxx.xxx 訂閱
a跟b的資料型態是什麼?
mynameisoa
一般會員


發表:4
回覆:8
積分:2
註冊:2008-10-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-22 23:14:53 IP:163.13.xxx.xxx 訂閱
這是我用的方法

[code cpp]
//RGB separate
for(int y=0;yHeight;y ){
ptr = (Byte*)TempBitmap->ScanLine[y];
for(int x=0;xWidth;x ){
bmp_b=ptr[x*3];
bmp_g=ptr[x*3 1];
bmp_r=ptr[x*3 2];
}
}
[/code]
合併的話可以用RGB(B的成分,G的成分,R的成分); 這個函式...

你參考看看
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-24 11:10:23 IP:118.161.xxx.xxx 訂閱

===================引 用 taishyang 文 章===================
a跟b的資料型態是什麼?

a陣列為圖片原始的數值,b陣列是將a陣列轉換
------
jason
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-29 14:08:10 IP:60.251.xxx.xxx 訂閱
fly093218你好

我用個小範例解釋你的問題

DWORD a = 0xFFFFFF, b;
b = a >> 16; //b => 0xFF
a = b << 16; //a => 0xFF0000

從這範例就可以看出 做過又移再左移的a是不會一樣的(右移的位元被清掉了)
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-31 00:16:52 IP:118.161.xxx.xxx 訂閱

===================引 用 blk5743 文 章===================
fly093218你好

我用個小範例解釋你的問題

DWORD a = 0xFFFFFF, b;
b = a >> 16; //b => 0xFF
a = b << 16; //a => 0xFF0000

從這範例就可以看出 做過又移再左移的a是不會一樣的(右移的位元被清掉了)

嗯嗯,我了解,感謝您~
那請問有沒有方法可以還原呢?
------
jason
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-31 13:36:18 IP:60.251.xxx.xxx 訂閱

===================引 用 fly093218 文 章===================
我先用以下方法將RGB分離:
for(int y=0;y<=511;y ){
for(int x=0;x<=511;x ){
b[x][y]=((a[x][y])>>16);
}
}
原始值為10658466(16進制) 轉為十進制162162162 分離後為162
可是之後我想再將他還原回去,用相同的方法得到的值卻不一樣
for(int y=0;y<=511;y ){
for(int x=0;x<=511;x ){
b[x][y]=((a[x][y])<<16);
}
}
所得到的值卻為 -1566441472
麻煩請各位大大及高手們幫忙解答,謝謝!!

***********************************************************
我再仔細看了一下 發現了幾個問題
1. RGB一般來說是各8bits共為24bits 你的原始值0x10658466為什麼會用到32bits(或許你的RGB並非各用8bits表示)
2. 10658466(16進制) => 275088486(10進制) 為什麼你的值是162162162
3. 你的原始值a[x][y]的陣列根本都沒動過,為什麼還需要還原(被改變的是b[x][y])
4. 我從你還原得到的值-1566441472(0xA2A20000)以及你的10進制值162162162來猜
你真正的原始值應該是0xA2A2A200(RGB值各為0xA2 => 162),因此在a[x][y]<<16之後,會變成0xA2A20000也就是你得到的-1566441472
根據以上的判斷,我猜有些地方你可能弄錯了,請在檢查一下吧

另外我之前回答的部份,只要被你清掉了,
電腦就不知道該回復為什麼值,因此就沒辦法還原了
系統時間:2018-02-24 0:34:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!