Re[5]: GDI+ vs Indexed Picture
От: mihailik Украина  
Дата: 14.05.03 14:58
Оценка: 13 (2)
M>кое как получилось, хотя на пример все равно хочется взглянуть

Из дома я забыл взять, так что сел и натворил заново.

M>но проблемма осталась. мне нужна была 2х цветная картинка чтобы сохранить его в gif c 2х цветной палитрой. он же не смотря на то что у меня двухцветный битмап сохраняет с палитрой 256.


Есть такое дело. В документации не описано, можно ли это победить. Возможно, при помощи дополнительных недокументированых атрибутов.

Например, длительность кванта времени для анимированного GIF не определяется готовым свойством. Но класс ImageAnimator и, с его помощью, PictureBox, грамотно и качественно отображают анимированные GIF'ы. Можешь посмотреть в исходниках ImageAnimator, они там через недокументированный номер читают дополнительные атрибуты Image.

Кажется, функция называется Image.GetPropertyItem. Но вряд ли тебе она поможет

А вот пример готовой программы, работа с BitmapData.

using System;

using System.Collections;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace BitmapDataSample
{
    class Class1
    {
        static string[] strMap=new string[]
            {
                "        ",
                "  ****  ",
                "     ** ",
                "  ***** ",
                " **  ** ",
                " **  ** ",
                "  *** **"
            };

        [STAThread]
        static void Main(string[] args)
        {
            // Преобразование строчного представления в битовое
            // (я сделал не совсем верно по порядку битов —
            //  буква будет повёрнута вокруг вертикальной оси)
            BitArray[] bitLines=new BitArray[strMap.Length];
            for( int iRow=0; iRow<strMap.Length; iRow++ )
            {
                bitLines[iRow]=new BitArray(8);
                for( int iBit=0; iBit<8; iBit++ )
                {
                    bitLines[iRow][iBit]=
                        ( strMap[iRow][iBit]==' ' );
                }
            }

            // Заполнение битмапа
            Bitmap bmp=new Bitmap(8,strMap.Length,PixelFormat.Format1bppIndexed);
            BitmapData bmpData=bmp.LockBits(
                new Rectangle(0,0,8,strMap.Length),
                ImageLockMode.ReadWrite,
                PixelFormat.Format1bppIndexed );
            try
            {
                byte[] tmpArr=new byte[1];
                for( int i=0; i<strMap.Length; i++ )
                {
                    bitLines[i].CopyTo(tmpArr,0);

                    // расчёт адреса
                    IntPtr scanI=(IntPtr)(
                        bmpData.Scan0.ToInt64()+
                        bmpData.Stride*i );

                    // занесение
                    Marshal.Copy(
                        tmpArr, 0,
                        scanI, 1 );
                }
            }
            finally
            {
                bmp.UnlockBits(bmpData);
            }

            // Отображние для людей
            Form f=new Form();
            PictureBox p=new PictureBox();
            p.Image=bmp;
            p.SizeMode=PictureBoxSizeMode.StretchImage;
            f.Controls.Add(p);

            f.ShowDialog();
        }
    }
}
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.