【发布时间】:2014-02-27 01:29:02
【问题描述】:
我有一个来自 postscript 文件的十六进制字符串。
<< /ImageType 1
/Width 986 /Height 1
/BitsPerComponent 8
/Decode [0 1 0 1 0 1]
/ImageMatrix [986 0 0 -1 0 1]
/DataSource <
803fe0503824160d0784426150b864361d0f8844625138a4562d178c466351b8e4763d1f904864523924964d27944a6552b964b65d2f984c665339a4d66d379c4e6753b9e4f67d3fa05068543a25168d47a4526954ba648202
> /LZWDecode filter >> image } def
以下是我正在使用的方法。更新颜色的方法我已经注释掉了。
public static void ProcessImageColourMapping()
{
string imageDataSource = "803fe0503824160d0784426150b864361d0f8844625138a4562d178c466351b8e4763d1f904864523924964d27944a6552b964b65d2f984c665339a4d66d379c4e6753b9e4f67d3fa05068543a25168d47a4526954ba648202";
string imageDataSourceUpdated = GetUpdatedImage(imageDataSource);
}
public static string GetUpdatedImage(string strImageDataSource)
{
string imageDataSourceUpdated = "";
byte[] imageBytes = StringToByteArray(strImageDataSource);
Bitmap bitmapImage = ByteArrayToBitmap(imageBytes);
//UpdateColour(bitmapImage);
byte[] imageBytesUpdated = BitmapToByteArray(bitmapImage);
imageDataSourceUpdated = ByteArrayToString(imageBytesUpdated);
return imageDataSourceUpdated;
}
public static byte[] StringToByteArray(String imageHexString)
{
int numberOfChars = imageHexString.Length / 2;
byte[] byteArray = new byte[numberOfChars];
using (var sr = new StringReader(imageHexString))
{
for (int i = 0; i < numberOfChars; i++)
byteArray[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
}
return byteArray;
}
public static Bitmap ByteArrayToBitmap(byte[] byteArray)
{
int width = 986; //width and height are taken from postscript file for testing a single hex string.
int height = 1;
Bitmap bitmapImage = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
BitmapData bmpData = bitmapImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
try
{
Marshal.Copy(byteArray, 0, bmpData.Scan0, byteArray.Length);
}
finally
{
bitmapImage.UnlockBits(bmpData);
}
return bitmapImage;
}
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
try
{
Marshal.Copy(bmpdata.Scan0, bytedata, 0, numbytes);
}
finally
{
bitmap.UnlockBits(bmpdata);
}
return bytedata;
}
public static string ByteArrayToString(byte[] byteArray)
{
StringBuilder hex = new StringBuilder(byteArray.Length * 2);
foreach (byte b in byteArray)
{
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString();
}
问题:
在下面的代码中,我没有为传入的十六进制字符串 imageDataSource 更新任何内容。
将其转换为 byte[] - 然后转换为 Bitmap - 返回 byte[] - 最后返回 Hex 字符串。
所以,imageDataSourceUpdated 应该与 imageDataSource 具有相同的值。
但是,当我最终检查imageDataSourceUpdated 的值时,结果为:
803fe0503824160d0784426150b864361d0f8844625138a4562d178c466351b8e4763d1f904864523924964d27944a6552b964b65d2f984c665339a4d66d379c4e6753b9e4f67d3fa05068543a25168d47a4526954ba64820200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.....
附加了这么多零。
可以请指导我在这里缺少什么。
【问题讨论】:
-
您是否尝试在您的
ByteArrayToBitmap方法中使用PixelFormat.Format8bppIndexed而不是PixelFormat.Format32bppPArgb?
标签: c# colors bitmap postscript