Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: GetPixel Добавлено: 12.12.07 23:46  

Автор вопроса:  Skywalker | Web-сайт: iSkywalker.ru | ICQ: 300-70-6пятьЪ 
Можно ли как-нибудь убыстрить этот процесс? сейчас прогонял картинку размер 2592x1944 30 мин, дождался только трети или половины, не помню. Это же умереть можно!

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 Сашок



ICQ: 387093431 

Вопросов: 1
Ответов: 70
 Профиль | | #1 Добавлено: 13.12.07 00:15
какая тебя система?

Ответить

Номер ответа: 2
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #2
Добавлено: 13.12.07 00:47
пень4 3.0 ггц
512 память

вот нашел код на C# с unsafe методами, скомпилил в длл, разница может и есть, но я ее пока не замечаю, потом засеку как-нибудь

вот код, может пригодится кому

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Image {
    public unsafe class FastBitmap {

        public struct PixelData {
            public byte blue;
            public byte green;
            public byte red;
        }

        Bitmap Subject;
        int SubjectWidth;
        BitmapData bitmapData = null;
        Byte* pBase = null;

        public FastBitmap(Bitmap SubjectBitmap) {
            this.Subject = SubjectBitmap;
            try {
                LockBitmap();
            } catch (Exception ex) {
                throw ex;
            }
            
        }

        public void Release() {
            try {
                UnlockBitmap();
            } catch (Exception ex) {
                throw ex;
            }
        }

        public Bitmap Bitmap {
            get {
                return Subject;
            }
        }

        public void SetPixel(int X, int Y, Color Colour) {
            try {
                PixelData* p = PixelAt(X, Y);
                p->red = Colour.R;
                p->green = Colour.G;
                p->blue = Colour.B;
            } catch (AccessViolationException ave) {
                throw (ave);
            } catch (Exception ex) {
                throw ex;
            }
        }

        public Color GetPixel(int X, int Y) {
            try {
                PixelData* p = PixelAt(X, Y);
                return Color.FromArgb((int)p->red, (int)p->green, (int)p->blue);
            } catch (AccessViolationException ave) {
                throw (ave);
            } catch (Exception ex) {
                throw ex;
            }
        }

        private void LockBitmap() {
            GraphicsUnit unit = GraphicsUnit.Pixel;
            RectangleF boundsF = Subject.GetBounds(ref unit);
            Rectangle bounds = new Rectangle((int)boundsF.X,
                ;(int)boundsF.Y,
                ;(int)boundsF.Width,
                ;(int)boundsF.Height);

            SubjectWidth = (int)boundsF.Width * sizeof(PixelData);
            if (SubjectWidth % 4 != 0) {
                SubjectWidth = 4 * (SubjectWidth / 4 + 1);
            }

            bitmapData = Subject.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            pBase = (Byte*)bitmapData.Scan0.ToPointer();
        }

        private PixelData* PixelAt(int x, int y) {
            return (PixelData*)(pBase + y * SubjectWidth + x * sizeof(PixelData));
        }

        private void UnlockBitmap() {
            Subject.UnlockBits(bitmapData);
            bitmapData = null;
            pBase = null;
        }
    }
}


FastBitmap FBitmap = new FastBitmap(MyOriginalBitmap);
...
FBitmap.Release();

если у кого-то побыстрее чтото есть,предлагайте)

Ответить

Номер ответа: 3
Автор ответа:
 Сашок



ICQ: 387093431 

Вопросов: 1
Ответов: 70
 Профиль | | #3 Добавлено: 13.12.07 00:53
впринцыпе этот код должен работать достатосно быстро... я слышал, что для быстродействия нужно юзать jpeg library

Ответить

Номер ответа: 4
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #4
Добавлено: 13.12.07 10:16
ну вот щас засек, картинка 1024х768
обычно: 51297 мс
с использованием вышеприведенного класса: 23281 мс
т.е. более чем в 2 раза быстрее.

Ответить

Номер ответа: 5
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #5
Добавлено: 13.12.07 10:47
Где-то (вроде даже на митуе) видел статью одну... там описывалась быстрая потоковая обработка изображний. Поищи.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам