6 Temmuz 2017 Perşembe

Image

Alpha Channel Nedir ?
Alpha channel bir RGB renginin ne kadar transparan olduğunu belirtir. Alpha channel 0 ise renk tamamen saydam sayılır ve kendisi yerine altındaki renk gösterilir. Rengin saydamlığını gösteren formül aşağıda.
float alpha = pixel.alpha / 255;
buffer[offset_dst].R += pixel[offset_src].R * alpha;
buffer[offset_dst].G += pixel[offset_src].G * alpha;
buffer[offset_dst].B += pixel[offset_src].B * alpha;
ColorModel Alpha Channel'a Sahip mi ?
Java
Örnek:
boolean hasAlpha(Image image) {
 // If buffered image, the color model is readily available
 if (image instanceof BufferedImage) {
  BufferedImage bimage = (BufferedImage)image;
  return bimage.getColorModel().hasAlpha();
 }

 // Use a pixel grabber to retrieve the image's color model;
 // grabbing a single pixel is usually sufficient
 PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
 try {
  pg.grabPixels();
 } catch (InterruptedException e) {}

 // Get the image's color model
 ColorModel cm = pg.getColorModel();
 return cm.hasAlpha();
}

SampleModel Nedir?
SampleModel sınıfı, DataBuffer sınıfının içinde dizinin neyi temsil ettiğini belirtir. Örnekteki şekilde dizinin her 3 byte'lık alanının bir pixel olduğu görülebilir.
 PixelInterleavedSampleModel sampleModel
= new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, //The data type of the image buffer elements
                                    width, //The width of the image
                                    height, //The height of the image
                                    3, //The number of data buffer elements per pixel
                                    3*width, //The number of data buffer elements per line
                                    new int[] {2,1,0}//The location of colour components for each pixel
                                    );
DPI Nedir
Dots per inch anlamına geliyor. Bir resmi basarken inch başına kaç pixel kullanılacağını belirtir. Yani basma kalitesini belirler, ekranda gösterilen resim ile alakası yoktur.
 
BufferedImage Sınfı
Java'da Image bir soyut sınıf, BufferedImage ise onu gerçekleştiren bir sınıf. Bu sınıf yukarıda gösterilen yardımcı sınıfları da içeriyor. Aşağıdaki şekilde görülebilir.
 
Yukarıdaki GrayScale açıklamasından da görülebildiği gibi bu sınıfın ImageType parametresi ColorModel'de kullanılan elemanların pixel başına kaç bit/byte ile temsil edileceğini gösterir.

Image Okuma
C#
Bitmap bitmap = Bitmap.FromFile(@"C:\m.png") as Bitmap;

Java
ImageIO
getReaderFileSuffixes
Bu metod ile ImageIO sınıfının okuyabildiği formatlar listeleniyor. Örnek:
 
read
Burada bir çok örnek var. Temel olarak ImageIO sınıfının read() metodu kullanılıyor.
Bir başka örnek:

Bir diğer örnekte ise ImageIcon sınıfı yaratılıyor.

Java AWT
Örnek:
Toolkit.getImage() metodu kullanılıyor.
Image img=Toolkit.getDefaultToolkit().getImage("1.png"); 
 
QT
QImage sınıfı iki şekilde yüklenebilir. 
QImage Image = QImage(fileName);
veya
QImage Image;
Image.load("../punton.png");


Image Yazma
C#
croppedBitmap.Save(@"C:\m-1.png", System.Drawing.Imaging.ImageFormat.Png);
Java
Image Boyutlarını Alma
Java
QT
QImage sınıfı ile bu iş başarılabiliyor.
QImage Image = QImage(fileName);
int width = Image.width();
int height = Image.height (); 
Burada dikkat edilmesi gereken nokta QT ile gelen plugin sistemi. JPEG gibi formatları okumak için libjpeg plugini lazımken PNG formatı native olarak okunabiliyor.

Image Formatını Değiştirme
Java
Örneği buradan aldım ve JAI kullanıyor.

QT
Aşağıdaki örnek image JPG olarak yükleniyor ve hafızadaki bir alana PNG olarak yazılıyor.
QImage image ("picture.jpg");
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG"); // writes image into ba in PNG format  
Image'ı Yeniden Boyutlandırma
Java
getScaledInstance() metodu ile yapılabilir. Örnek:
BufferedImage bimage = ImageIO.read(file);
Image img = bimage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
C#
İstenilen boyutta yeni bir Bitmap sınıfı yaratılır. Örnek:


Image'ı Gri Renk Yapma
Java
imaging processing programme sorusundan aldığım örnek aşağıda.

Image İçine Yazma
Java
Örnek:
//Create image in memory
int imgWidth_max = 410;
int imgHeight_max = 230;
BufferedImage img = new BufferedImage(img_width, img_height, BufferedImage.TYPE_INT_RGB);

//Get graphics of image
Graphics g = img.getGraphics();
g.setColor(Color.WHITE);

//Fill image
g.fillRect(0, 0, img_width, img_height);

//Set pen color
g.setColor(Color.BLACK);

//Create font
int fontSize = 22;
Font f = new Font("SERIF", Font.BOLD, fontSize);
g.setFont(f);

//Draw string
String s = //populate
g.drawString(s,10, 35);

g.dispose();

ImageIO.write(img, "jpeg", new File(dest));


Image'ı Byte Array Yapma
Her image sınıfının içinde resim verisinin depolandığı bellek alanı var. Bu alan kabaca aşağıdaki büyüklükte.
Çeşitli diller resim verisine erişmek için sınıflar tanımlamışlar.
Java
Java'da resim verisine erişmek için DataBufferByte sınıfı kullanıyor.
Örneği buradan aldım. Verilen image dosyası okunduktan sonra internal olarak her nasıl temsil ediliyorsa onu byte[] haline getiriyor. Bu ne işe yarar bilmiyorum.
File imgPath = new File("ImageName");
BufferedImage bufferedImage = ImageIO.read(imgPath);
WritableRaster raster = bufferedImage .getRaster();
DataBufferByte dataBuffer   = (
DataBufferByte) raster.getDataBuffer();   
byte[] data =  dataBuffer.getData(); 
Buradaki örnekte ise image verisi BufferedImage'a yazılıyor. 

void get8bitImage(byte[] data, int width, int height) {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    byte[] rasterData = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
    System.arraycopy(pixels, 0, rasterData, 0, pixels.length); // A LOT faster than 'setData()'
}

Bitmap'in Pixellerine Erişme
C#
Bitmap bmp = //get bitmap
Color c = bmp.GetPixel(j, i);// Extract the color of a pixel
// extract the red,green, blue components from the color.
int rd = c.R;
int gr = c.G;
int bl = c.B;
QT
QImage bmp = //get bitmap
QColor c = QColor::fromRgb (bmp.pixel(x,y) );// Extract the color of a pixel
// extract the red,green, blue components from the color.
int rd = c.red();
int gr = c.green();
int bl = c.blue(); 
Java
Örnek:
BufferedImage bf = //...
Color c = new Color(bfImage.getRGB(i,j));
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
Bir başka örnek ise burada.

Bitmap'in Pixel Derinliğini Bulma
Pixel derinliği, pixel başına kaç bit kullanıldığı anlamına geliyor.
QT
Aşağıdaki örneği Dividing QImage to smaller pieces sorusundan aldım.
QImage bmp = //get bitmap
bmp.depth ();//depth ile pixel derinliği bulunabilir.

Image Kesme (Cropping)
C#
Aşağıda büyük bir resimden daha küçük bir resim oluşturma örneği var.
Bitmap bmp;//Readint xstart = 355, ystart  = 318;
int width = 60, height = 60,
BitmapData bmpData = bmp.LockBits(new Rectangle(xstart,ystart ,width, height),
                            ImageLockMode.ReadWrite,
                            bmp.PixelFormat);
LockBits ile kilitlenen BitmapData sınıfı daha sonra iş bitince unlock edilmeli. Örnek:
bmp.UnlockBits(bmpData);
BitmapData sınıfının Stride isimli bir alanı var. Bu alan her bir satırda kaç byte olduğunu gösterir. BitmapData sınıfının pixellerine erişmek için aşağıdaki gibi yapılabilir.

BitmapData bmpData;//...
for (int y = 1; y < height-1; y++)
{
    for (int x = 0; x < width; x++)
    {
        int index = y * bmpData.Stride + (x * 4);
        unsafe
        {
            byte* prevLine = (byte*)data.Scan0;
            byte* currLine = prevLine + data.Stride;
            byte* nextLine = currLine + data.Stride;
            //...
            prevLine = currLine;
            currLine = nextLine;
            nextLine += bmpData.Stride;
        }
    }
}
Eğer bmpData sınıfına yeni veri kopyalanmak istenirse aşağıdaki gibi yapılabilir.
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, data.Scan0, size);

Bir diğer örnekte ise kaynak resimdeki RED renk filtreleniyor.

IntPtr destinationPtr = destinationBmd.Scan0;
uint* pDest = (uint*)destinationPtr.ToPointer();

int _w = sourceBmp.Width;
int _h = sourceBmp.Height;

for (int j = 0; j < _h; j++)
{
    for (int i = 0; i < _w; i++)
    {
        *pDest = (*pSource) & 0xff00ffff;
        pDest++;
        pSource++;
     }
}






Hiç yorum yok:

Yorum Gönder