2016-11-15 22 views
0

我創建了一個庫,可以從C#中的輸入數據創建Postscript文件。但是,使用以下代碼創建圖像時,圖像顯示不正確。這就像他們偏離了中心。從左到右,首先看到圖像的右側邊緣,然後圖像的左側顯示在圖像的剩餘分配空間中。爲了清楚起見,這就像是用「你好」這個詞,而不是顯示「ohell」。C#圖像到Postscript最終偏離中心

我正在使用下面的C#代碼來創建一個List對象,其中填充直接輸出到postscript文件的行。它看起來很標準,但我注意到我需要編碼的幾個特性。出於某種原因,我的75寬度圖像希望顯示爲76像素的寬度,所以我添加了該部分來爲其添加像素。我不知道這是爲什麼,我還沒有做足夠的測試,看看這一切都搞砸了。此外,通常情況下,我使用的圖像矩陣具有負高度,其次是高度,但圖像看起來顛倒,所以我不得不將其交換。

public virtual List<string> AddImage(Image img, int x, int y, int height, int width) 
{ 
    string sDataSource; 
    List<string> destinationList = new List<string>(); 
    int iImgWidth = img.Width; 

    if (iImgWidth % 2 != 0) 
    { 
     iImgWidth += 1; 
    } 

    using (MemoryStream ms2 = new MemoryStream()) 
    { 
     Bitmap bmp = (img as Bitmap).Clone(
      new Rectangle(0, 0, img.Width, img.Height), 
      PixelFormat.Format24bppRgb); 
     bmp.Save(ms2, ImageFormat.Bmp); 

     sDataSource = $"<{string.Join("", ms2.ToArray().Select(a => a.ToString("X2")))}>"; 
    } 

    destinationList.Add($"{x} {y} translate"); 
    destinationList.Add($"{width} {height} scale"); 
    destinationList.Add(
     $"/DeviceRGB setcolorspace {{ << /ImageType 1 /Width {iImgWidth} /Height {img.Height} /ImageMatrix [{iImgWidth} 0 0 {img.Height} 0 {img.Height}] /BitsPerComponent 8 /Decode [0 1 0 1 0 1] "); 
    destinationList.Add($"/DataSource {sDataSource} >> image }} exec "); 

    return destinationList; 
} 

我得到的輸出縮小到下面,它仍然顯示不正確。

%!PS-Adobe-3.1 
0 649 translate 
27 20 scale 
/DeviceRGB setcolorspace { << /ImageType 1 /Width 76 /Height 56 /ImageMatrix [76 0 0 56 0 -56] /BitsPerComponent 8 /Decode [0 1 0 1 0 1] 
/DataSource <... (hex code)> >> image } exec 
showpage 

任何人都可以點我在正確的方向?我一直在爲此掙扎好幾天。

+0

我已將示例代碼上傳到SourceForge,並在「文件」部分包含示例輸入和輸出。 https://sourceforge.net/projects/postscript-image-import-test/ –

回答

0

有兩種可能性,你已經在你的文章中提到了他們兩個,但沒有原始圖像數據,它不可能告訴你的假設是否正確。

首先是你的圖像顛倒了。在PostScript中,0,0是頁面的左下角,並且增加y會向上移動頁面。圖像通常從左上角開始,然後沿着頁面前進。

所以通常圖像矩陣將是[w 0 0 -h 0 h]而你似乎發射的是[w 0 0 h 0 -h]。當然這可能是正確的,如果不知道原始圖像中樣本的進展順序,則不可能確定。

也有可能您的位圖數據不正確,或者寬度錯誤(事實上,您的寬度超出了預期的可疑範圍),以便PostScript解釋器以半個光柵寬度開始白色。在此之後,它會將您期望的圖像作爲圖像的第一個(左側)部分,直到它讀取(並呈現)了整個柵格線的足夠數據。

然後解釋器移動到下一行圖像並讀取以下數據。這些數據由第一條光柵線的右邊部分組成,然後由第二條線的左邊部分組成。

依此類推。然後看起來圖像被包裹了。

這當然是猜測,因爲您沒有提供輸入數據或最終PostScript程序的示例。我建議你發佈一個完整的示例輸出並鏈接到這裏。爲了演示原始示例順序,原始圖像可能也會有用。

[查看文件後]

那麼從JPEG,我以爲是原來的文件,我看到你的十六進制字符串數據不匹配在解壓縮JPEG數據出發,也不我期望的。

由於大部分的圖像是白色的,我希望看到爲0xFF 0xFF的0xFF的的RGB三胞胎,你的數據與衆生:

424D0E0901000000000036000000280000009600000096000000010018000000000000000000232E0000232E00000000000000000000

我不知道那是什麼,但我有理由相信它不是原始圖像數據的一部分。它看起來像你的十六進制字符串是135710字節。現在,寬度爲150 * 3字節(對於高度爲RGB = 450 * 150的結果,預期數據爲67,500字節* 2,對於十六進制表示,意味着您的數據應該是135000字節。所以它看起來像我的字符串'可能'大約710個字節太多,或者118個RGB三元組太多了,我可能在這裏搞了一些算術,但事實證明這是你的字符串中的第一個'FF',這是可疑的:-)

我不會說C#,所以我看不到你的代碼(實際上我甚至無法從SourceForge項目中找到實際代碼)。然而,在我看來,你有解碼JPEG或打開輸出文件等問題。在數據流開始時去除奇怪的東西並不能解決問題,但後來我不知道多少是多餘的.....

鑑於此問題的性質,我認爲我的第一件事會做的是使用其他工具來提取圖像數據(只是RGB三元組)。然後讓我自己的代碼寫出相同的數據,理想情況下這些數據應該是相同的,但是JPEG dequantisation可能存在細微差異。但是數據長度至少應該相同,內容應該非常相似。

在圖像的邊緣出現一些奇怪的「藍色」像素,我懷疑你在這裏應用的解碼出了問題。看着原始的我看不到效果來自哪裏,原來我沒有看到垂直線。

順帶一提,您應該知道,某些PostScript實現對64KB的字符串長度有限制,並且您的字符串已超過該限制。因此,您的文件將無法使用Adobe Acrobat Distiller或任何其他Adobe PostScript解釋器運行。如果你想創建更大的圖像,你將不得不改變你的方法。

+0

[w 0 0 h 0 h]似乎適用於這些圖像,雖然我不明白爲什麼。最後-h是我的錯誤。 –