Страница: 1 |
Страница: 1 |
Вопрос: GetPixel
Добавлено: 12.12.07 23:46
Автор вопроса: Skywalker | Web-сайт:
Можно ли как-нибудь убыстрить этот процесс? сейчас прогонял картинку размер 2592x1944 30 мин, дождался только трети или половины, не помню. Это же умереть можно!
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Сашок
ICQ: 387093431
Вопросов: 1
Ответов: 70
Профиль | | #1
Добавлено: 13.12.07 00:15
какая тебя система?
Номер ответа: 2
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #4
Добавлено: 13.12.07 10:16
ну вот щас засек, картинка 1024х768
обычно: 51297 мс
с использованием вышеприведенного класса: 23281 мс
т.е. более чем в 2 раза быстрее.
Номер ответа: 5
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #5
Добавлено: 13.12.07 10:47
Где-то (вроде даже на митуе) видел статью одну... там описывалась быстрая потоковая обработка изображний. Поищи.