2009-04-02 5 views
10

Мне нужно добавить текст в файл изображения. Мне нужно прочитать один файл изображения (jpg, png, gif), и мне нужно добавить к нему один текст строки.Добавление текста в файл изображения

+0

Вглядываясь в него. Проблема в том, что при открытии файла он заблокирован, поэтому вы не можете сохранить его в том же файле. Вернусь к вам ... –

ответ

0

Вы можете сделать это, используя объект Graphics в C#. Вы можете получить объект Graphics из изображения (image.CreateGraphics() - или что-то вроде этого, как я помню), и использовать некоторые встроенные методы для добавления к нему текста, например: Graphycs.DrawString() или другие связанные методы.

20

Ну в GDI + вы читали в файле с использованием класса изображения, а затем использовали класс Graphics для добавления в него текста. Что-то вроде:

Image image = Image.FromFile(@"c:\somepic.gif"); //or .jpg, etc... 
    Graphics graphics = Graphics.FromImage(image); 
    graphics.DrawString("Hello", this.Font, Brushes.Black, 0, 0); 

Если вы хотите сохранить файл поверх старого, код должен немного изменить как метод Image.FromFile() блокирует файл, пока он не удален. Вот, что я придумал:

FileStream fs = new FileStream(@"c:\somepic.gif", FileMode.Open, FileAccess.Read); 
    Image image = Image.FromStream(fs); 
    fs.Close(); 

    Bitmap b = new Bitmap(image); 
    Graphics graphics = Graphics.FromImage(b); 
    graphics.DrawString("Hello", this.Font, Brushes.Black, 0, 0); 

    b.Save(@"c:\somepic.gif", image.RawFormat); 

    image.Dispose(); 
    b.Dispose(); 

я бы проверить это довольно хорошо, хотя :)

+0

Просто играйте адвоката дьявола здесь: вам, очевидно, нужно будет сохранить его потом! –

+0

Надеюсь, это поможет. –

+0

как повернуть этот текст, затем добавить картинку? –

1

Специально для GIFs иметь результат GIF, вы должны написать на каждом кадре, как следующее:

string originalImgPath = @"C:\test.gif"; 
Image IMG = Image.FromFile(originalImgPath); 
FrameDimension dimension = new FrameDimension(IMG.FrameDimensionsList[0]); 
int frameCount = IMG.GetFrameCount(dimension); 
int Length = frameCount; 
GifBitmapEncoder gEnc = new GifBitmapEncoder(); 
for (int i = 0; i < Length; i++) 
{ 
    // Get each frame 
    IMG.SelectActiveFrame(dimension, i); 
    var aFrame = new Bitmap(IMG); 

    // write one the selected frame 
    Graphics graphics = Graphics.FromImage(aFrame); 
    graphics.DrawString("Hello", new Font("Arial", 24, System.Drawing.FontStyle.Bold), System.Drawing.Brushes.Black, 50, 50); 
    var bmp = aFrame.GetHbitmap(); 
    var src = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       bmp, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 
    // merge frames 
    gEnc.Frames.Add(BitmapFrame.Create(src)); 
} 

string saveImgFile = @"C:\modified_test.gif" 
using (FileStream fs2 = new FileStream(saveImgFile, FileMode.Create)) 
{ 
    gEnc.Save(fs2); 
} 

Я должен был упомянуть, что получение gif-фреймов от this post.

+0

https://stackoverflow.com/a/48395131/485008 –

Смежные вопросы