2016-04-08 15 views
0

Ich habe einige Nachforschungen angestellt und einige Hinweise gefunden, aber ich brauche Hilfe, um herauszufinden, wie man ein Farbbild am besten in Graustufen umwandeln kann. Obwohl es viele Beispiele für eine schnelle Konvertierung gibt, suche ich nach einer allmählichen UND zufälligen Konvertierung. Ich möchte also ein Bild anzeigen, das im Laufe der Zeit zu einem Graustufenbild von 0 bis 100% der Bildfläche in zufällige Pixel wird.Allmählich und zufällig Farbbild in Java in Graustufen ändern?

Ich brauche keinen vollständigen Code, nur einige Methoden, vielleicht wird das mich in die richtige Richtung führen.

Eine Idee, die ich habe, ist es, Bilder mit verschiedenen Graustufen ein- und auszuwechseln. Ist das das Beste, was ich tun kann? Keine Echtzeitkonvertierung?

Danke.

+0

Können Sie genauer sein? – ControlAltDel

+0

Sie möchten also wissen, wie Sie ein zufälliges Pixel auswählen, das zuvor nicht ausgewählt wurde, und es in Graustufen ändern? 0% 100% aller ausgewählten Pixel gleitende Skala? –

+0

Zeigen Sie Beispiele dafür, was Sie vorhaben. Verwenden Sie ein Werkzeug wie Gimp oder Photoshop, um sie zu erstellen. –

Antwort

0

Die Idee wie ich es verstehe ist allmählich grau-isierung; das konvergiert allmählich zum Graustufenbild. Dies kann wie gesagt erreicht werden, indem man sich diesem annähert; ein Konvergenzproblem.

Wenn die Menge größer als der Konvergenzwert ist, verringern wir; Wenn es kleiner ist, nehmen wir zu.

In der ersten Schleife finden wir den Mittelwert (Konvergenzwert).

int[] avg=new int[pix.length]; 
    for(i=0; i<wc; i++) 
    for(j=0; j<hc; j++) { 
     int p=bim.getRGB(i, j); 
     int p1=(p&0x00ff0000)>>16, p2=(p&0x0000ff00)>>8, p3=p&0x000000ff; 
     avg[i+j*wc]=(p1+p2+p3)/3; 
    } 

In der zweiten Schleife führen wir die Konvergenz:

wir erhöhen/jede der drei Farbkomponenten ab, bis alle zusammenlaufen: von einem kleinen Schritt von 10 in diesem Fall, dass Sie den Wert auswählen.

Wenn der Wert innerhalb einer Konvergenzeinheit (z. B. weniger als 10) liegt, setzen wir den Wert auf den Konvergenzwert. Wenn das für alle Pixel passiert, haben wir Graustufen erreicht.

boolean f1=false, f2=false, f3=false; 
while(true) { 
    f1=false; f2=false; f3=false; 
    for(i=0; i<wc; i++) 
    for(j=0; j<hc; j++) { 
     int p=bim.getRGB(i, j); 
     int p1=(p&0x00ff0000)>>16, p2=(p&0x0000ff00)>>8, p3=p&0x000000ff; 
     if(p1>avg[i+j*wc]+10) { p1-=10; if(p1<avg[i+j*wc]) p1=avg[i+j*wc]; f1=true; } 
     else if(p1<avg[i+j*wc]-10) { p1+=10; if(p1>avg[i+j*wc]) p1=avg[i+j*wc]; f1=true; } 
     if(p2>avg[i+j*wc]+10) { p2-=10; if(p2<avg[i+j*wc]) p2=avg[i+j*wc]; f2=true; } 
     else if(p2<avg[i+j*wc]-10) { p2+=10; if(p2>avg[i+j*wc]) p2=avg[i+j*wc]; f2=true; } 
     if(p3>avg[i+j*wc]+10) { p3-=10; if(p3<avg[i+j*wc]) p3=avg[i+j*wc]; f3=true; } 
     else if(p3<avg[i+j*wc]-10) { p3+=10; if(p3>avg[i+j*wc]) p3=avg[i+j*wc]; f3=true; } 
     bim.setRGB(i, j, 0xff000000|(p1<<16)|(p2<<8)|p3); 
    } 
    if(f1 || f2 || f3) ; else { System.err.println("no change"); break; } 
} 
+0

@ gpash. Ich entschuldige mich, wenn Sie unten meine Antwort nicht gesehen haben, aber danke! Das hätte ich nicht berücksichtigt und passt besser zu meinen Bedürfnissen als ursprünglich gedacht. Prost! – Richard

0

Danke allen. Das ist, was ich habe und was es tut so weit ....

import java.io.File; 
import java.io.IOException; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 
import java.util.*; 

public class Color2GrayscaleImage{ 
    public static void main(String args[])throws IOException{ 

    Scanner input= new Scanner(System.in); 

    System.out.println("What percent of the image do you want grayscaled?"); 

    int percentCover=input.nextInt(); 
    double per=(percentCover/100); 
    BufferedImage img = null; 
    File f = null; 

    try{ 
     f = new File("media/mini0n.jpg"); 
     img = ImageIO.read(f); 
    }catch(IOException e){ 
     System.out.println(e); 
    } 

    //get image width and height 
    int width = img.getWidth(); 
    int height = img.getHeight(); 

System.out.println(width+"x"+height+". "+width*height+ " total pixels."); 

    //convert entire image to grayscale 
    //for(int y = 0; y < height; y++){ 
     //for(int x = 0; x < width; x++){ 
     //int p = img.getRGB(x,y); 
     int num; 
     for (num=0; num<5; num++){ 
     //randomly select pixels to be converted to grayscale 
     for(int heightY = 0; heightY < height*(1+per); heightY++){ 
     for(int widthX = 0; widthX < width*(1+per); widthX++){ 

    Random random=new Random(); 
    int x= random.nextInt((width)); 
     int y= random.nextInt((height)); 

     int p = img.getRGB(x,y); 

     int a = (p>>24)&0xff; 
     int r = (p>>16)&0xff; 
     int g = (p>>8)&0xff; 
     int b = p&0xff; 

     //calculate average 
     int avg = (r+g+b)/3; 

     //replace RGB value with avg 
     p = (a<<24) | (avg<<16) | (avg<<8) | avg; 

     img.setRGB(x, y, p); 

     } 
    } 
    //write image 
    try{ 
     f = new File("media/altered/new_IMAGE"+num+".jpg"); 
     ImageIO.write(img, "jpg", f); 
    }catch(IOException e){ 
     System.out.println(e); 
    }} 
    num++; 
    } 
} 

https://www.dropbox.com/s/uf9plmmrepvxfqi/gradual.jpg?dl=0

+0

Sorry Leute, das ist das Bild. http://i.imgur.com/hb9Zb9L.jpg – Richard

+0

ok das Bild zeigt, was Sie wollen: Das ist nicht zufällig ändernde Graustufen Pixel - es ist allmähliche Gray-ization - das ist der Effekt als sichtbar – gpasch

+0

@gpasch. Fantastisch! Vielen Dank! Dies ist, was ich von deiner Hilfe bekommen habe. [link] (http://imgur.com/xNMYAfs) Ich kann sicherlich damit arbeiten! – Richard