2015-11-06 63 views
1

是否可以通過逐個像素地迭代並設置每個像素的RGB值來創建一個新的tif?使用LibTiff逐像素寫入tif?

讓我解釋我正在嘗試做什麼。我試圖打開一個現有的tif,使用TIFFReadRGBAImage讀取它,採用TIFFGetR/TIFFGetG/TIFFGetB給出的RGB值,從255中減去它們,取這些新值並用它們逐個寫入每個像素。最後,我想結束原始圖像和一個新的「補充」圖像,這將成爲原始圖像的負面影像。

有沒有辦法使用LibTiff來做到這一點?我已經瀏覽了文檔並搜索了Google,但是我只看到很短的代碼示例TIFFWriteScanline,它們提供了很少的代碼/上下文/註釋,我無法弄清楚如何以我想要的方式實現它它工作。

我對編程還是比較陌生的,所以如果有人可以請我指出一個有大量解釋性評論的完整例子,或者直接用我的代碼幫助我,我將非常感激。感謝您花時間閱讀本文並幫助我學習。

我有什麼至今:

// Other unrelated code here... 

    //Invert color values and write to new image file 
    for (e = height - 1; e != -1; e--) 
    { 
     for (c = 0; c < width; c++) 
     { 
      red = TIFFGetR(raster[c]); 
      newRed = 255 - red; 
      green = TIFFGetG(raster[c]); 
      newGreen = 255 - green; 
      blue = TIFFGetB(raster[c]); 
      newBlue = 255 - blue; 
      // What to do next? Is this feasible? 
     } 
    } 

// Other unrelated code here... 

Full code如果你需要它。

+0

自從我寫了tiff代碼以來已經有一段時間了,但您可以毫無困難地手動構建圖像。除非你知道所有的資料來源都是一種格式,否則一定要注意不同的格式,壓縮,單獨的平面等。對於'接下來做什麼',建立一個完整的圖像行,然後使用TIFFWriteScanline(....)。 –

+1

@johnelemans好的,謝謝。關於如何使用RGB值創建線條的任何指導? – Aizenmyouou

回答

2

我回去看看我的舊代碼。事實證明,我沒有使用libtiff。儘管如此,你正走在正確的軌道上。你想要的東西像;

lineBuffer = (char *)malloc(width * 3) // 3 bytes per pixel 
    for all lines 
    { 
     ptr = lineBuffer 
     // modify your line code above so that you make a new line 
     for all pixels in line 
     { 
      *ptr++ = newRed; 
      *ptr++ = newGreen; 
      *ptr++ = newBlue 
     } 
     // write the line using libtiff scanline write 
     write a line here 
    } 

請記住設置適當的標籤。這個例子假設3個字節的像素。 TIFF還允許在每個平面上的每個像素1個字節的獨立平面。

或者,您也可以將整個圖像寫入新緩衝區,而不是一次寫入一行。

+0

啊。現在我的腦汁再次流動!非常感謝你指點我正確的方向!你幫了很多忙。 – Aizenmyouou