Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение Размеров Картинки 
:(
    Опции темы
rubenhak
  Дата 3.5.2004, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 17.9.2003
Где: Yerevan

Репутация: нет
Всего: нет



Люди кто поможет написать прогу которая изменит размеры картинки.
Точнее - у меня есть Bitmap [NxN] нужно уменьшить на K%-ов .
Реализация может быть на Delphi , Java , .NET все равно.

Я немножко покопался и узнал что есть пары алгоритмов
bilinear interpolation, Catmull-Rom BSpline interpolation и.т.д
но который выбрать и что он из себя представляет не имею
понятия.

PM WWW MSN   Вверх
Guest
Дата 3.5.2004, 12:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











A почему не подходит метод Graphics::DrawImage из GDI+ (FCL)?
  Вверх
Kurt
Дата 3.5.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Полностью согласен с уважаемым Guest.
Воспользуйся DrawImage() - у него более 30 перегруженных вариантов, но тебе в принципе нужен такой:
DrawImage(Image picture, Rectangle dest, Rectangle source, GraphicsUnit myUnit),
где picture - твоя картинка,
dest - прямоугольник, КУДА выводится картинка,
source - прямоугольник, ОТКУДА выводится картинка (т.е. прямоугольник из твоей картинки - обычно пригождается, когда надо увеличить некоторый кусок картинки..).
Теперь смотри. Действует правило - если прямоугольник, КУДА выводим, не совпадает с прямоугольником, ОТКУДА выводим, картинка АВТОМАТИЧЕСКИ изменяется (увеличивается/уменьшается), чтобы точно вписаться в dest.
Т.е. что бы увеличить картинку, нам надо увеличить dest, чтобы уменьшить - уменьшить его же.
Причем, как ты понимаешь, насколько увеличишь dest - настолько и картинку.
Короче, я тебе набросал простенький пример.
Возьми небольшую картинку где-то 100х100 пикселей.
Если кликнешь на форме левой кнопкой - изображение увеличится, правой - уменьшится. Тока извиняй, я для понятности не стал позиционировать картинку по центру при каждом изменении размеров - но эт мелочи..
Итак, вот код (готов к компиляции):
Код

/*
ImageZooming.cs
*/

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace ImageZooming
{
public class ImageZooming : Form
{
 private Image _bMapImage; //здесь мы храним наше изображение
 private Rectangle _dest = new Rectangle(50,50,200,200); //прямоугольник, КУДА мы рисуем
 private Rectangle _source = new Rectangle(0,0,200,200); //прямоугольник, ОТКУДА мы рисуем
 
 public ImageZooming()
 {
  this.Text = "Zooming test..";
  //устанавилваем обработчики событий
  this.Load += new System.EventHandler(this.OnLoad);
  this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMouseUp);
  this.Paint += new System.Windows.Forms.PaintEventHandler(this.OnPaint);

  return;
 }


 private void OnLoad(object sender, EventArgs e)
 {
  this._bMapImage = new Bitmap("image1.bmp");
  //в начале размеры прямоугольников совпадают с загруженной картинкой.
  //в принципе, эт не обязательно
  this._source.Width = this._bMapImage.Width;
  this._source.Height = this._bMapImage.Height;
  this._dest.Width = this._bMapImage.Width;
  this._dest.Height = this._bMapImage.Height;
  return;
 }
 
 private void OnPaint(object sender, PaintEventArgs e)
 {
  Graphics g = e.Graphics;
  //рисуем наше изображение
  g.DrawImage(this._bMapImage,this._dest, this._source,GraphicsUnit.Pixel);
  return;
 }

 private void OnMouseUp(object sender, MouseEventArgs e)
 {
  if (e.Button == MouseButtons.Left) //если нажата левая кнопка, то УВЕЛИЧИВАЕМ изображение, увеличивая размеры прямоугольника, куда мы выводим рисунок
  {
   this._dest.Width *=2;
   this._dest.Height *=2;
  }
  else //иначе - уменьшаем..
  {
   this._dest.Width /=2;
   this._dest.Height /=2;
  }
  this.Invalidate();
 }

 public static void Main()
 {
  Application.Run(new ImageZooming());
  return;
 }

}
}



--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Хоббит
Дата 10.5.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



... а если необходимо изменить размер картинки (пропорционально уменьшить) и хранить опять его в Image ??? 
PM MAIL   Вверх
Balu
Дата 11.5.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.8.2002

Репутация: нет
Всего: 1



Вот из моего проекта:
Код

        /// <summary>
        /// Возвращает измененное изображение по размеру
        /// </summary>
        /// <param name="original">Оригинальное изображение</param>
        /// <param name="size_X">Требуемый размер по горизонтали</param>
        /// <param name="size_Y">Требуемый размер по вертикали</param>
        /// <param name="resolution_X">DPI (разрешенрие) по горизонтали</param>
        /// <param name="resolution_Y">DPI (разрешенрие) по вертикали</param>
        /// <param name="isScale">Изменить ли размер изображения пропорционально</param>
        /// <param name="isCenter">Центровать ли изображение</param>
        /// <returns></returns>
        private static Bitmap GetImage ( Bitmap original, int size_X, int size_Y, float resolution_X, float resolution_Y, bool isScale, bool isCenter )
        {
            if (size_X <= 0 || size_Y <= 0)
            {
                return null;
            }

            Bitmap res;

            if ( isScale )
            {
                float koefScale;
                int offset_X = 0;
                int offset_Y = 0;

                if ( original.Size.Width == original.Size.Height )
                {
                    koefScale = (float)original.Size.Width / (float)size_X;
                }
                else
                {
                    if ( original.Size.Width > original.Size.Height )
                    {
                        koefScale = (float)original.Size.Width / (float)size_X;
                        offset_Y = ( size_Y - Convert.ToInt32 ( (float)original.Size.Height / koefScale ) ) / 2;
                    }
                    else
                    {
                        koefScale = (float)original.Size.Height / (float)size_Y;
                        offset_X = ( size_X - Convert.ToInt32 ( (float)original.Size.Width / koefScale ) ) / 2;
                    }
                }
                int newWidth = Convert.ToInt32 ( (float)original.Size.Width / koefScale );
                int newHeight = Convert.ToInt32 ( (float)original.Size.Height / koefScale );

                Bitmap cloneBitmap = new Bitmap ( original, new Size ( newWidth, newHeight ) );
                if (isCenter && (offset_X != 0 || offset_Y != 0))
                {
                    res = Copy ( cloneBitmap, new Rectangle ( offset_X, offset_Y, newWidth, newHeight ), size_X, size_Y );
                }
                else
                {
                    res = cloneBitmap;
                }
            }
            else
            {
                res = new Bitmap ( original, new Size ( size_X, size_Y ) );                
            }

            if ( resolution_X > 0 )
            {
                if ( res.HorizontalResolution > resolution_X || res.VerticalResolution > resolution_Y )
                {
                    res.SetResolution ( resolution_X, resolution_Y );
                }
            }

            return res;
        }
  

Это сообщение отредактировал(а) Balu - 11.5.2006, 10:55
PM MAIL   Вверх
mr.DUDA
Дата 11.5.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Хоббит @  10.5.2006,  21:41 Найти цитируемый пост)
... а если необходимо изменить размер картинки (пропорционально уменьшить) и хранить опять его в Image ???  

Создай новый Bitmap (с пом. new Bitmap (width, height, format)), сделай для него Graphics (Graphics.FromImage) и всё что ты будешь рисовать в этот Graphics, автоматически попадёт на битмап. Таким образом, можно взять исходный битмап NxN, создать новый битмап MxM и графикс для него, вывести первый битмап в графикс с пом. DrawImage, вот и всё. 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 11.5.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



ндя ... спасибо .. не подумал немного 
PM MAIL   Вверх
useless
Дата 19.5.2006, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 18.5.2004

Репутация: нет
Всего: 1



Люди, вы паритесь.
Используйте метод GetThumbnailImage из класса Image. Класс Bitmap - производный от Image. 
--------------------
Лучше день потерять, потом за 5 минут долететь !!!
PM MAIL ICQ   Вверх
Timus
Дата 30.3.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Всё конечно хорошо. Но
Код

if (isCenter && (offset_X != 0 || offset_Y != 0))
{
res = Copy ( cloneBitmap, new Rectangle ( offset_X, offset_Y, newWidth, newHeight ), size_X, size_Y );
}



Откуда Copy ( ... ); ? 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.