[解決] C++讀.raw灰階圖檔
開發平台(Platform):Visual C++ 2005
問題(Question):檔案輸出不正確(不是我想要的Smoothing)
餵入的資料(Input):a.raw(一張FullHD無檔頭的灰階點陣圖)
預期的正確結果(Expected Output):ba.raw(a.raw的模糊影像)
原圖
http://www.wretch.cc/album/show.php?i=darkblack&b=33&f=1788349860&p=1
錯誤結果(Wrong Output):
使用C語言的版本是使用unsigned char儲存0-255的資料
C版程式
http://codepad.org/NuSax7x1
使用FILE指標把資料放進陣列中
但是在C++不知道怎麼將資料正確的放進陣列中
程式可以執行!但是輸出圖檔是錯誤的!
用 file.read() 和 ofile.write()但是它只吃char
http://codepad.org/rbV5jue0
不過輸出的圖檔效果是最接近預想的模糊圖形!不會是亂到不行的亂碼!
http://www.wretch.cc/album/show.php?i=darkblack&b=33&f=1788349859&p=0
因為資料型態不是unsigned char所以,我猜會造成溢位!改了資料型態!
後來再改語法
把 file.read() 改成 file >>
把ofile.write()改成ofile <<
但是依然不對!圖檔變成亂碼!
就不知道問題出在哪了!
程式碼(Code):(請善用置底文網頁, 記得排版)
#include<iostream>
#include<fstream>
using namespace std;
#define frameH 1920
#define frameV 1080
int main()
{
unsigned char *fp = new unsigned char [frameH*frameV];
fstream file;
file.open("a.raw", fstream::in | fstream::binary);
if( !file.good())
cout << "file讀檔失敗" << endl;
for(int i = 0 ; i < frameH ; ++i){
for(int j = 0 ; j < frameV ; ++j){
file >> *(fp+(i+j*frameH));
}}
file.close();
unsigned int *ifp = new unsigned int [frameH*frameV];
for(int i = 0 ; i < frameH ; ++i){
for(int j = 0 ; j < frameV ; ++j){
*(ifp+i+j*frameH) = *(fp+i+j*frameH);
}}
double temp;
for(int i = 1 ; i < frameH-1 ; ++i){
for(int j = 1 ; j < frameV-1 ; ++j){
temp =
*(ifp + (i-1) + (j-1)* frameH) +
*(ifp + i + (j-1)* frameH) +
*(ifp + (i+1) + (j-1)* frameH) +
*(ifp + (i-1) + j * frameH) +
*(ifp + i + j * frameH) +
*(ifp + (i+1) + j * frameH) +
*(ifp + (i-1) + (j+1)* frameH) +
*(ifp + i + (j+1)* frameH) +
*(ifp + (i+1) + (j+1)* frameH);
*(ifp+i+j*frameH) = (temp /9);
}}
for(int i = 0 ; i < frameH ; ++i){
for(int j = 0 ; j < frameV ; ++j){
*(fp+i+j*frameH) = *(ifp+i+j*frameH);
}}
fstream ofile;
ofile.open("ba.raw", fstream::out | fstream::binary);
if( !ofile.good())
cout << "ofile讀檔失敗" << endl;
for(int i = 0 ; i < frameH ; ++i){
for(int j = 0 ; j < frameV ; ++j){
ofile << *(fp+(i+j*frameH));
}}
ofile.close();
delete [] fp;
delete [] ifp;
system("PAUSE");
return 0;
}
補充說明(Supplement):
用C寫過一次!為了練習C++而練習的習作!
最後解出來:
→ VictorTom:要用原來的方式file.read()讀才對(fp傳入前要cast就是) 05/27 23:08
→ VictorTom:http://nopaste.info/e41919c5f5.html 改過的code.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.33.224.25
※ 編輯: Zephyr750 來自: 114.33.224.25 (05/24 19:14)
※ 編輯: Zephyr750 來自: 114.33.224.25 (05/24 19:18)
→
05/24 19:18, , 1F
05/24 19:18, 1F
推
05/24 23:20, , 2F
05/24 23:20, 2F
→
05/24 23:20, , 3F
05/24 23:20, 3F
→
05/24 23:21, , 4F
05/24 23:21, 4F
→
05/24 23:21, , 5F
05/24 23:21, 5F
→
05/24 23:22, , 6F
05/24 23:22, 6F
※ 編輯: Zephyr750 來自: 114.33.224.25 (05/25 19:11)
→
05/25 19:12, , 7F
05/25 19:12, 7F
→
05/25 19:13, , 8F
05/25 19:13, 8F
→
05/25 19:13, , 9F
05/25 19:13, 9F
→
05/25 19:36, , 10F
05/25 19:36, 10F
→
05/25 19:46, , 11F
05/25 19:46, 11F
→
05/25 19:47, , 12F
05/25 19:47, 12F
→
05/25 20:16, , 13F
05/25 20:16, 13F
→
05/25 20:43, , 14F
05/25 20:43, 14F
→
05/25 23:24, , 15F
05/25 23:24, 15F
推
05/25 23:29, , 16F
05/25 23:29, 16F
→
05/25 23:30, , 17F
05/25 23:30, 17F
→
05/25 23:31, , 18F
05/25 23:31, 18F
→
05/25 23:31, , 19F
05/25 23:31, 19F
→
05/26 00:29, , 20F
05/26 00:29, 20F
※ 編輯: Zephyr750 來自: 114.33.224.25 (05/26 00:32)
→
05/26 00:33, , 21F
05/26 00:33, 21F
推
05/26 00:51, , 22F
05/26 00:51, 22F
→
05/26 00:52, , 23F
05/26 00:52, 23F
→
05/26 07:14, , 24F
05/26 07:14, 24F
→
05/26 23:07, , 25F
05/26 23:07, 25F
→
05/26 23:23, , 26F
05/26 23:23, 26F
→
05/26 23:24, , 27F
05/26 23:24, 27F
推
05/26 23:58, , 28F
05/26 23:58, 28F
→
05/26 23:58, , 29F
05/26 23:58, 29F
→
05/26 23:59, , 30F
05/26 23:59, 30F
→
05/27 00:00, , 31F
05/27 00:00, 31F
→
05/27 00:00, , 32F
05/27 00:00, 32F
→
05/27 00:02, , 33F
05/27 00:02, 33F
→
05/27 00:03, , 34F
05/27 00:03, 34F
推
05/27 00:08, , 35F
05/27 00:08, 35F
→
05/27 00:08, , 36F
05/27 00:08, 36F
→
05/27 00:09, , 37F
05/27 00:09, 37F
→
05/27 00:13, , 38F
05/27 00:13, 38F
→
05/27 07:11, , 39F
05/27 07:11, 39F
→
05/27 07:22, , 40F
05/27 07:22, 40F
將三種版本的程式
/* //將fp轉ifp取消
for(int i = 0 ; i < frameH ; ++i){
for(int j = 0 ; j < frameV ; ++j){
*(ifp+i+j*frameH) = *(fp+i+j*frameH);
}}
*/
int temp;
for(int i = 1 ; i < frameH-1 ; ++i){
for(int j = 1 ; j < frameV-1 ; ++j){
temp = //原本讀寫ifp,改成讀fp寫入ifp
*(fp + (i-1) + (j-1) * frameH) +
*(fp + i + (j-1) * frameH) +
*(fp + (i+1) + (j-1) *frameH) +
*(fp + (i-1) + j * frameH) +
*(fp + i + j * frameH) +
*(fp + (i+1) + j *frameH) +
*(fp + (i-1) + (j+1)* frameH) +
*(fp + i + (j+1)* frameH) +
*(fp + (i+1) + (j+1)*frameH) ;
*(ifp+i+j*frameH) = (temp /9);
}}
就算是這樣,程式結果(圖有沒有問題)依然不會有任何影響
smoothign演算法應該會有影響,不過,不是大問題
※ 編輯: Zephyr750 來自: 114.33.224.25 (05/27 07:27)
推
05/27 09:25, , 41F
05/27 09:25, 41F
→
05/27 09:25, , 42F
05/27 09:25, 42F
→
05/27 09:26, , 43F
05/27 09:26, 43F
推
05/27 09:38, , 44F
05/27 09:38, 44F
→
05/27 09:39, , 45F
05/27 09:39, 45F
→
05/27 22:43, , 46F
05/27 22:43, 46F
→
05/27 22:44, , 47F
05/27 22:44, 47F
推
05/27 23:05, , 48F
05/27 23:05, 48F
→
05/27 23:05, , 49F
05/27 23:05, 49F
→
05/27 23:06, , 50F
05/27 23:06, 50F
→
05/27 23:06, , 51F
05/27 23:06, 51F
→
05/27 23:08, , 52F
05/27 23:08, 52F
→
05/27 23:12, , 53F
05/27 23:12, 53F
→
05/27 23:12, , 54F
05/27 23:12, 54F
→
05/27 23:21, , 55F
05/27 23:21, 55F
→
05/27 23:38, , 56F
05/27 23:38, 56F
→
05/27 23:39, , 57F
05/27 23:39, 57F
→
05/27 23:41, , 58F
05/27 23:41, 58F
推
05/27 23:44, , 59F
05/27 23:44, 59F
→
05/27 23:45, , 60F
05/27 23:45, 60F
→
05/27 23:46, , 61F
05/27 23:46, 61F
→
05/27 23:47, , 62F
05/27 23:47, 62F
→
05/27 23:47, , 63F
05/27 23:47, 63F
→
05/27 23:47, , 64F
05/27 23:47, 64F
→
05/27 23:48, , 65F
05/27 23:48, 65F
※ 編輯: Zephyr750 來自: 219.81.194.122 (05/27 23:50)
推
05/28 00:00, , 66F
05/28 00:00, 66F
→
05/28 00:01, , 67F
05/28 00:01, 67F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章