Trabalhando com imagens

11/03/2010

Ola preciso criar uma espécie de thumbs.
eu estou usando este código


 protected bool ResizeImagem(string nomeArquivo, string Caminho)
    {
        bool resultado = false;

        int Largura = 180;
        //Grande
        try
        {
            System.Drawing.Image objImage = System.Drawing.Image.FromFile(Caminho);
            int Altura = (objImage.Height / (objImage.Width / Largura));
            System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
            System.Drawing.Image thumbNailImg = objImage.GetThumbnailImage(Largura, Altura, dummyCallBack, IntPtr.Zero); //dados dentro dos parenteses: largura, altura...
            thumbNailImg.Save(Server.MapPath("empreendimento/imagesApartamentos/grd/" + nomeArquivo)); //onde está “thumbnail.jpg” mude para o nome desejad para a thumbnail
            //fechando conexoes
            thumbNailImg.Dispose();
            objImage.Dispose();
            resultado = true;
        }
        catch (Exception)
        {
            resultado = false;
        }

}

esta funcionando normalmente,

ele defina uma largura da imagem atual e tras a altura necessária e cria um novo objeto,

mas preciso da seguinte situação


Eu posso fazer o download de variso tipos de imagens e tamanhos...retrato, paisagem   com altura e largunras diferentes.

pensando desta forma preciso



1.  identificar a altura e largura da imagem
2. definir onde esta o centro da imagem
3. a partir deste ponto  recortar ( ou guardar, criando um novo objeto ) na forma ( altura e largura) que eu preciso, ou seja um quadrado.




um bom exemplo é quando vamos fazer um cadastro,   como Wordpress, uol, MSN e fazemos o upload da imagem,
derepente aparece uma página com um quadrado para que possamos definir (ou recortar ) emcima da imagem enviada.



só quero que isto seja feito automaticamente.



Espero ter sido claro.
















Fernando Reis

Fernando Reis

Curtidas 0

Respostas

Fernando Reis

Fernando Reis

11/03/2010

Alguem pode ajudar???      
GOSTEI 0
Fabio Mans

Fabio Mans

11/03/2010

Olá Fernando para resolver esta situação os métodos abaixo podem te ajudar.
O método CalculateDimensions faz o exatemente o que você precisa.



    private static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
        {
            using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
            {
                Size newSize = CalculateDimensions(oldImage.Size, targetSize);
                using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
                {
                    using (Graphics canvas = Graphics.FromImage(newImage))
                    {
                        canvas.SmoothingMode = SmoothingMode.AntiAlias;
                        canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                        canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
                        MemoryStream m = new MemoryStream();
                        newImage.Save(m, ImageFormat.Jpeg);
                        return m.GetBuffer();
                    }
                }
            }
        }

        private static Size CalculateDimensions(Size oldSize, int targetSize)
        {
            Size newSize = new Size();
            if (oldSize.Height > oldSize.Width)
            {
                newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
                newSize.Height = targetSize;
            }
            else
            {
                newSize.Width = targetSize;
                newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
            }
            return newSize;
        }





public static void InsertNews(string title, string summary, string news, byte[] photoOriginal,
            string photosize, string legend)
        {
            DBAccess db = new DBAccess();
            db.AddParameter("@Title", title);
            db.AddParameter("@Summary", summary);
            db.AddParameter("@News", news);
            db.AddParameter("@PhotoOriginal", photoOriginal);
            db.AddParameter("@Photo", ResizeImageFile(photoOriginal, 280));
            db.AddParameter("@PhotoThumb", ResizeImageFile(photoOriginal, 80));
            db.AddParameter("@PhotoSize", photosize);
            db.AddParameter("@Legend", legend);
            db.AddParameter("@Date", DateTime.Now);
            db.AddParameter("@Author", UtilMembership.CurrentUserName);

            db.ExecuteNonQuery("dev_News_Insert");
        }



No meu curso de News eu explico como fazer.

Fabio


GOSTEI 0
Fernando Reis

Fernando Reis

11/03/2010

Fabio,



Deixa ver se entendi,
 este codigo pega uma imagem,

e cria uma outra com o tamanho definido, esta correto???



GOSTEI 0
Fabio Mans

Fabio Mans

11/03/2010

Isso porém você não precisa ficar calculando as dimensões, você só passa o tamanha que precisa. Não é isso que precisa?

Fabio
GOSTEI 0
Fernando Reis

Fernando Reis

11/03/2010

então,

na verdade não,

deixa tentar explicar

por exemplo tenh ouma foto com    H180 X W240

preciso por padrão   40 X 40

se eu fizer um redimensionamento padrão a foto ficará  distorcida, correto?



imagine que eu tenho um quadrado na mão de 40 x 40  coloco acima da foto, bem no meio e recorte esta imagem e faça um upload desta NOVA image.

entende?
GOSTEI 0
Fabio Mans

Fabio Mans

11/03/2010

Fernando os métodos que te passei fazem exatamente isso que você está precisando.   Tenho uma imagem 896x724 - Está perfeita   Quero corta-la  e que ela fique com o tamanho de   230Xpor"naoseiovalor". O método irá recortar e manter a proporção para que a imagem na tenha distorções.     Faça um teste nos métodos que te passei, assista meus vídoes no curso de News. Se eu não me engano o curso é este https://www.devmedia.com.br/articles/viewcomp.asp?comp=5453     Abs
GOSTEI 0
Fabio Mans

Fabio Mans

11/03/2010

40x40 ela irá distorcer, com certeza, não tem a mesma proporção.   Faça teste no Photoshop. Você tem que informar o valor inicial perceba que o Photoshop ajusta sozinho, é a mesma coisa que o método faz.       =============================================================== por exemplo tenh ouma foto com H180 X W240 preciso por padrão 40 X 40
GOSTEI 0
Fernando Reis

Fernando Reis

11/03/2010

Fabio,


Desculpe minha "ignorância"


Mas pelo que li , ainda acho que não fui claro..

vou tentar novamente.   ( me permita)


Tenho uma imagem de  Height :100 X  200 Width:.



o Centro desta imagem esta em 50 H e 100 W.

a partir deste ponto CENTRAL

quero criar uma nova imagem com :   20 Pixels para direita e esquerda e 20 Pixel  Baixo e Acima.

Não quero DIMENSIONAR A IMAGEM.

seria como ....... recortar a imagem...entende?



quero pegar a imagem original e recortar 40x40 bem no meio dela. sem me preocupara com distorção....


Vi um exemplo que trabalhava com uma expressão chamada "Rectangle",


sera isto?







 




GOSTEI 0
Fabio Mans

Fabio Mans

11/03/2010

Entendi.   Se eu pegar uma foto quer cortar somente o centro, é isso?   Veja se a idéia é esta?   http://hubpages.com/hub/c-crop-image-to-a-Thumbnail   Ou   http://www.codeproject.com/KB/GDI-plus/imageresize.aspx      
GOSTEI 0
Fernando Reis

Fernando Reis

11/03/2010

OI


É O PRIMEIRO,


VALEU,

DEU CERTINHO

GOSTEI 0
POSTAR