有的游戏载入一个存档图片就能还原当时的数据,应该是利用图片写入有纯当的额外数据。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string pathPic = @"D:1.jpg";
private void button1_Click(object sender, EventArgs e)
{
// addImageComment(path1, "test wgscd 测试!!");
addImageComment(pathPic, Properties.Resources.String1);
}
private void btn2_Click(object sender, EventArgs e)
{
string msg = extractComment(pathPic);
MessageBox.Show(msg);
}
/// <summary>
/// 字符串转Unicode码
/// </summary>
/// <returns>The to unicode.</returns>
/// <param name="value">Value.</param>
private string StringToUnicode(string value)
{
byte[] bytes = Encoding.Unicode.GetBytes(value);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bytes.Length; i += 2)
{
// 取两个字符,每个字符都是右对齐。
stringBuilder.AppendFormat("u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString();
}
/// <summary>
/// Unicode转字符串
/// </summary>
/// <returns>The to string.</returns>
/// <param name="unicode">Unicode.</param>
private string UnicodeToString(string unicode)
{
string resultStr = "";
string[] strList = unicode.Split('u');
for (int i = 1; i < strList.Length; i++)
{
resultStr += (char)int.Parse(strList[i], System.Globalization.NumberStyles.HexNumber);
}
return resultStr;
}
public void addImageComment(string imageFlePath, string comments)
{
string jpegDirectory = System.IO.Path.GetDirectoryName(imageFlePath);
string jpegFileName = System.IO.Path.GetFileNameWithoutExtension(imageFlePath);
BitmapDecoder decoder = null;
BitmapFrame bitmapFrame = null;
BitmapMetadata metadata = null;
if (System.IO.File.Exists(imageFlePath))
{
// load the jpg file with a JpegBitmapDecoder
using (Stream jpegStreamIn = File.Open(imageFlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
bitmapFrame = decoder.Frames[0];
metadata = (BitmapMetadata)bitmapFrame.Metadata;
if (bitmapFrame != null)
{
BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
if (metaData != null)
{
string ascStr = StringToUnicode(comments);
// modify the metadata
metaData.SetQuery("/app1/ifd/exif:{uint=37510}", ascStr);//comment
// get an encoder to create a new jpg file with the new metadata.
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));
// Save the new image
using (Stream jpegStreamOut = File.Open(imageFlePath, FileMode.Create, FileAccess.ReadWrite))
{
encoder.Save(jpegStreamOut);
}
}
}
}
}
public string extractComment(string imageFilePath)
{
string getinfo = "";
string jpegDirectory = System.IO.Path.GetDirectoryName(imageFilePath);
string jpegFileName = System.IO.Path.GetFileNameWithoutExtension(imageFilePath);
BitmapDecoder decoder = null;
BitmapFrame bitmapFrame = null;
BitmapMetadata metadata = null;
FileInfo originalImage = new FileInfo(imageFilePath);
if (File.Exists(imageFilePath))
{
// load the jpg file with a JpegBitmapDecoder
using (Stream jpegStreamIn = File.Open(imageFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
bitmapFrame = decoder.Frames[0];
metadata = (BitmapMetadata)bitmapFrame.Metadata;
if (bitmapFrame != null)
{
BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
if (metaData != null)
{
try
{
byte[] info = Encoding.Default.GetBytes(metadata.GetQuery("/app1/ifd/exif:{uint=37510}").ToString());
getinfo = Encoding.ASCII.GetString(info);
}
catch
{
return string.Empty;
}
}
}
}
string ret = UnicodeToString(getinfo);
return ret;
}
}
}
另外:
C# using System.Windows.Media.Imaging;该引用哪个dll
在网上看到BitmapSource和WriteableBitmap一些类听说是用 using System.Windows.Media.Imaging;可是我发现VS中没有什么System.Windows.Media.Imaging之类的框架,这就苦逼了,在网上也找不到,无意间发现原来引用不叫System.Windows.Media.Imaging,而是
PresentationCore
只需要在引用-->程序集-->框架-->PresentationCore找到这个就行了,另外我发现using System.Windows.Media不仅仅是在PresentationCore中有,而且WindowsBase也有引用方式
引用-->程序集-->框架-->WindowsBase
以后大家就不要再走弯路了,这个引用比较邪门,居然using System.Windows.Media.Imaging要引用PresentationCore真是不可思议!